Django技术问题:如何保存提交表单的用户相关信息?
实现已登录用户性别信息自动填入表单的方案
嘿,我来帮你搞定这个需求——把当前登录用户UserProfile里的性别信息关联到Post表单/对象中对吧?咱们一步步调整代码就行:
1. 先给Post模型添加性别字段(如果需要存储的话)
目前你的Post模型里没有存储性别的字段,所以首先得补上这个字段,和UserProfile的性别定义保持一致:
from django.contrib.auth.models import User class Post(models.Model): user = models.ForeignKey(to=User, on_delete=models.CASCADE) discord = models.CharField(max_length=500) post = models.CharField(max_length=500) telegram = models.CharField(max_length=128) # 新增性别字段,和UserProfile的选项对齐 FEMALE = 'FEMALE' MALE = 'MALE' SEX = ( (MALE, 'Male'), (FEMALE, 'Female'), ) sex = models.CharField(max_length=5, choices=SEX, default=MALE) def __str__(self): return self.post
修改完模型后,别忘了执行数据库迁移:
python manage.py makemigrations python manage.py migrate
2. 调整PostForm表单(可选:显示性别或隐藏)
如果希望在表单里展示用户的性别(设为只读,避免用户修改),可以这样修改PostForm:
class PostForm(forms.ModelForm): discord = forms.CharField(max_length=500, help_text="Please enter the title of the post.") post = forms.CharField(max_length=500, help_text="Please enter the post.") telegram = forms.CharField(max_length=128, help_text="Please enter your telegram id.") # 添加性别字段,设置为只读 sex = forms.CharField(widget=forms.TextInput(attrs={'readonly': 'readonly'}), required=False) class Meta: model = Post exclude = ("user",)
要是不想让用户看到这个字段,换成隐藏控件就行:
sex = forms.CharField(widget=forms.HiddenInput(), required=False)
3. 在视图中自动填充性别信息
接下来修改add_post视图,从当前用户的UserProfile中取出性别,在表单初始化或保存Post对象时赋值:
@login_required def add_post(request): # 获取当前用户关联的UserProfile(确保每个用户都有对应的Profile哦) user_profile = UserProfile.objects.get(user=request.user) if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): post = form.save(commit=False) post.user = request.user # 把UserProfile里的性别赋值给Post对象 post.sex = user_profile.sex post.save() return index(request) else: print(form.errors) else: # GET请求时,预先把性别填充到表单里 form = PostForm(initial={'sex': user_profile.sex}) return render(request, 'rango/add_post.html', {'form': form})
额外小提示
- 要确保每个注册用户都有对应的
UserProfile对象,可以用Django信号(比如post_save)在创建User时自动生成Profile,避免出现DoesNotExist错误。 - 如果不需要在Post中存储性别,只是想在页面上显示用户的性别,那完全不用修改模型和表单,直接在模板里调用即可:
<p>Your Gender: {{ user.userprofile.sex }}</p>
这样就能轻松实现把已登录用户的性别信息填入表单或者关联到Post数据里啦!
内容的提问来源于stack exchange,提问作者Cristian Lo Iacono
相关产品推荐
相关产品推荐

