【问题标题】:Setting user kwargs as field vales in Django Form with Class-based View使用基于类的视图将用户 kwargs 设置为 Django 表单中的字段值
【发布时间】: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


    【解决方案1】:

    我需要做的是在查询集中选择用户 obj:

        self.fields['referrer'].initial = User.objects.filter(id=referrer).first()
        
    

    但是使用self.fields['referrer'].disabled = True 禁用了该字段,所以我在提交时仍然得到一个空白值(禁用不会像文档所说的那样做)。使用 self.fields['referrer'].initial = User.objects.filter(id=referrer).first() 并将该字段设置为只读允许表单以初始值提交

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 2011-01-23
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多