Django модельная форма с дополнительными параметрами не будет проверяться - PullRequest
1 голос
/ 05 августа 2020

Я просмотрел более дюжины потоков SO в django формах проверки, но не смог понять, почему моя форма не проверяет и не выводит никаких ошибок.

Форма создается на основе модель и загружается с двумя настраиваемыми параметрами item и size_choices.

Я предполагаю, что каким-то образом инициализация моей формы ошибочна? Я также подумал, что, возможно, это потому, что я создаю форму только для подмножества полей модели, но еще не заполняю все поля модели, согласно django документации , этого не должно быть проблема, поскольку проверяются только включенные поля.

Вот упрощенные коды модели, формы, представления и шаблона:

модель:

class Order(models.Model):
    # item description
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    itemSizes = [(s,s.upper()) for s in  ['xxs','xs','s','m','l','xl','xxl','xxxl','count']]
    size = models.CharField("Item size", max_length = 5, choices = itemSizes)
    quantity = models.IntegerField(default=1)
    
    class Recipient(models.TextChoices):
        TEAM = 'TEAM MEMBER'
        RETAIL = 'RETAIL'

    recipient = models.CharField(max_length=11, choices = Recipient.choices, default=Recipient.RETAIL)
    date = models.DateField('date of order',auto_now_add=True)

форма:

class itemOrderForm(forms.ModelForm):
    def __init__(self,size_choices = None,item=None ,*args,**kwargs):                  
        super().__init__(*args,**kwargs) #itemOrderForm,self
        if size_choices:
            self.fields['size'].choices = size_choices
            self.fields['item'].initial = item
            #self.fields['item'].disabled=True
            #print("GOT HERE")
 
    class Meta:
        model = Order
        fields = ('item','size', 'quantity')

вид:

def orderCart(request):
    context = {}
    if request.method == 'POST':
        form = itemOrderForm(request.POST)
        print(form.is_valid()) 
        print(form.errors) #this doesn't print anything 
        if form.is_valid():
            print("VALID!!!")
    item = Item.objects.all()[0]    
    context['form'] = itemOrderForm(size_choices =[('s','S'),('m','M')],item=item)
    return render(request, 'inv_check/ordercart.html', context)

шаблон:

{% extends 'inv_check/base.html' %}

{% block content %}
<div class="container">      
    <form method="post" >
            {% csrf_token %}
            {{ form.as_table }}
        <td><input type="submit" value="Add to cart"/></td>
    </form>
</div>
{% endblock %}

1 Ответ

0 голосов
/ 05 августа 2020

После небольшой работы кажется, что валидатору формы Django не нравятся аргументы ключевого слова, передаваемые в форму def __init__ (), поэтому попытка передать size_choices и item в def __init__ (self,size_choices,item...) могла быть виноват.

Лучшим способом передачи аргументов остается **kwargs. Последующая модификация def __init__ ()... дала те же результаты и может пройти проверку формы Django.

Форма:

    def __init__(self,*args,**kwargs): #size_choices=None,max_quant=100,  
        size_choices = kwargs.pop('size_choices',None)
        max_quant = kwargs.pop('max_quant',None)
        item = kwargs.pop('item', None)
        super(itemOrderForm,self).__init__(*args,**kwargs) #itemOrderForm,self
        
        if size_choices:
            self.fields['item'].choices = [(s,s) for s in [item]]
            self.fields['size'].choices = size_choices
            #self.fields['quantity'].choices = [(i+1,i+1) for i in range(max_quant)]

view

context['form'] = itemOrderForm(size_choices = sizeChoices,max_quant = max_quant, item=item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...