Обязательное поле = False для ModelForm - PullRequest
0 голосов
/ 17 октября 2019

У меня есть модель 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 %}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Вероятно, вы можете сделать это так:

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 в шаблоне

0 голосов
/ 20 октября 2019

Я использовал это в своей форме, и это сработало:

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
0 голосов
/ 17 октября 2019

Просто добавьте blank=True в поле модели:

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

См. этот вопрос для хорошего объяснения разницы между blank и null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...