【问题标题】:Making field required = False on ModelForm必填字段 = ModelForm 上的 False
【发布时间】:2019-10-17 10:28:09
【问题描述】:

我有一个用户可以创建和编辑的 UserCoupon 模型。编辑后,如果没有与该代码关联的订单,我只希望他们能够编辑 UserCoupon 实例上的“代码”字段。当有与该优惠券代码关联的订单时,我不是在编辑优惠券表单上输出 {{form.code}},而是输出 {{form.instance.code}}。当用户尝试提交表单时,我收到一条错误消息,指出该字段是必需的。

如何使该字段不需要或以其他方式解决这种情况,以便当为模型表单定义的字段之一在模板中显示为字段的实例而不是输入框时,用户可以提交表单?

Models.py

class UserCoupon(models.Model):
    code = models.CharField(max_length=15, unique=True)
    amount = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

forms.py

class EditUserCouponForm (forms.ModelForm):

    class Meta:
        model = UserCoupon

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user',None)
        super(EditUserCouponForm, self).__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super(EditUserCouponForm, self).clean()

模板

{% if coupon_order_count > 0 %}

   {{form.instance.code}}

{% else %}

    {{form.code}}

{% endif %}

谢谢!

【问题讨论】:

    标签: django


    【解决方案1】:

    只需在模型字段中添加blank=True

    class UserCoupon(models.Model):
        code = models.CharField(max_length=15, unique=True, blank=True)
    

    请参阅this question,了解blanknull 之间的区别。

    【讨论】:

      【解决方案2】:

      或许你可以这样做:

      class EditUserCouponForm(forms.ModelForm):
      
          class Meta:
              model = UserCoupon
              fields = ['code']
      
          def __init__(self, *args, **kwargs):
              self.user = kwargs.pop('user',None)
              super(EditUserCouponForm, self).__init__(*args, **kwargs)
              if self.instance and self.instance.order_set.all().exists():  #checking if there are any orders with this coupon
                   self.fields['code'].widget.attrs['disabled'] = 'disabled'
      

      在视图中,确保在编辑时像这样传递实例:

      def coupon_view(request, pk):
           coupon = UserCoupon.objects.get(pk=pk)
           form = EditUserCouponForm(request.POST or None, user=request.user, instance=coupon)
           if request.method == "GET":
                return render('template', context={'form':form})
      

      可能你不需要在模板中使用coupon_order_count

      【讨论】:

        【解决方案3】:

        我在我的表单中使用了它并且它有效:

        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user',None)     
            self.coupon_order_count = kwargs.pop('coupon_order_count',None)        
            super(EditUserCouponForm, self).__init__(*args, **kwargs)
        
            if int(self.coupon_order_count) > 0:        
                self.fields['code'].required = False
        

        【讨论】:

          猜你喜欢
          • 2013-04-18
          • 1970-01-01
          • 2012-11-06
          • 2015-11-10
          • 2012-10-14
          • 2018-12-24
          • 2012-05-30
          • 2020-12-21
          • 2018-07-25
          相关资源
          最近更新 更多