【发布时间】:2021-08-14 04:22:52
【问题描述】:
我有一个 Django 应用程序 (1.11) 来跟踪推荐(由用户推荐)。我想将经过身份验证的用户的 id 传递给 ModelForm 'referrer' 字段(因为它来自当前登录的用户,所以该字段不应该是可编辑的)。
class Referral(models.Model):
name = models.CharField(max_length=100)
referrer = models.ForeignKey('users.User', on_delete=models.SET_NULL, related_name='referrals', null=True, blank=True)
查看:
class ReferralFormView(FormView):
form_class = ReferralForm
template_name = "refer.html"
success_url = reverse_lazy('thanks')
def get(self, request):
if request.user.is_authenticated():
return super(ReferralFormView, self).get(request)
else:
return redirect('login')
def get_form_kwargs(self):
user = self.request.user
form_kwargs = super(ReferralFormView, self).get_form_kwargs()
form_kwargs['referrer'] = user.id
return form_kwargs
def form_valid(self,form):
...
form.save()
return super(ReferralFormView, self).form_valid(form)
我在视图中覆盖get_form_kwargs,然后修改表单init
class ReferralForm(forms.ModelForm):
class Meta:
model = Referral
def __init__(self, *args, **kwargs):
referrer = kwargs.pop('referrer', None)
super(ReferralForm, self).__init__(*args, **kwargs)
self.fields['referrer'].disabled = True
self.fields['referrer'].queryset = User.objects.filter(id=referrer)
但是我看到的只是一个空白的推荐人字段,我缺少什么让用户成为该字段的值(无法编辑)?我也试过self.fields['referrer'].initial = User.objects.filter(id=referrer)。我不希望用户必须从一个查询集中选择自己的用户名。
我可以为user = User.objects.filter(id=referrer) 打印一个<QuerySet [<User: username>]>,那么为什么不将该用户设置为字段值呢?
更新:我可以分配用户值
self.fields['referrer'].initial = User.objects.filter(id=referrer).first()
self.fields['referrer'].disabled = True
但是,在表单提交时,Referral obj 不会与引用字段值一起保存(该值仍然为空)
谢谢
【问题讨论】:
标签: django django-views django-forms