【问题标题】:Django modelformset not saving data. Returns empty list after calling cleaned_dataDjango modelformset 不保存数据。调用cleaned_data后返回空列表
【发布时间】:2022-01-05 05:54:53
【问题描述】:

我的表单集有问题,它没有保存。控制台没有返回错误,但在调用 print(formset.cleaned_data) 后它返回空列表。标准格式正常保存。此表单集用于添加对汽车对象进行的服务。我在网上找不到答案,也许有人会帮助或找到更好的解决方案。

models.py

class Car(models.Model):
    FUEL = (
        ('', '---------'),
        ('1', 'Gasoline'),
        ('2', 'Diesel'),
        ('3', 'Electric'),
        ('4', 'Hybrid'),
    )

    client = models.ForeignKey(Client,on_delete=models.CASCADE, null=True, blank=True)
    car_make = models.ForeignKey(CarMake, on_delete=models.CASCADE)
    car_model = models.ForeignKey(CarModel, on_delete=CASCADE)
    fuel_type = models.CharField(max_length=15, choices=FUEL, default=None)
    engine = models.CharField(max_length=15)
    extra_info = models.TextField(max_length=300, verbose_name='Remarks', null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.client} | {self.car_make} {self.car_model}"
    
    class Meta:
        ordering = ('-date_updated',)
    

class Service(models.Model):
    car_relation = models.ForeignKey(Car, on_delete=models.CASCADE)
    service_name = models.CharField(max_length=200, verbose_name='Service')
    service_price = models.CharField(verbose_name='Price', blank=True, null=True, max_length=20)

    def __str__(self):
        return self.service_name

forms.py

class AddServiceForm(forms.ModelForm):
    class Meta:
        model = models.Service
        fields = ['service_name']

class CarForm(forms.ModelForm):
    class Meta:
        model = models.Car
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['car_model'].queryset = models.CarModel.objects.none() # returns no value till "Make" field is chosen, will be negated in elif statement

        if 'car_make' in self.data:
            try:
                car_make_id = int(self.data.get('car_make'))
                self.fields['car_model'].queryset = models.CarModel.objects.filter(make_id=car_make_id).order_by('model_name')
            except (ValueError, TypeError):
                pass
        elif self.instance.pk:
            self.fields['car_model'].queryset = self.instance.car_make.carmodel_set.order_by('model_name') # this negates the init overwrite

views.py

def car_create_view(request):
    ServiceFormset = modelformset_factory(Service, form=AddServiceForm, extra=0)
    formset = ServiceFormset
    if request.method == 'POST':
        form = CarForm(request.POST or None)
        formset = ServiceFormset(request.POST or None)
        if all([form.is_valid(), formset.is_valid()]):
            form.save()
            for f in formset:
                f.save()
            print(form, form.cleaned_data)
            print(formset, formset.cleaned_data)
        else:
            return HttpResponse('Something went wrong.')
            
    else:
        form = CarForm()
        formset = ServiceFormset
    return render(request, 'san_diego/car.html', {'carform': form, 'formset': formset})

模板

<form action='' method='post' id='carForm' data-carmodels-url="{% url 'ajax_load_car_models' %}">
    {% csrf_token %}
    {{ carform|crispy }}
    {% if formset %}
        <h3>Formset</h3>
        {{formset.management_form}}
        <div id='service-form-list'>
            <div class='service-form'>
                {{formset.form|crispy}} 
            </div>
        </div>
    
        <div id='empty-form' class='hidden'>{{formset.empty_form|crispy}}</div>
        <button id='add-more' type='button'>Add</button>
        <input type='submit' value='Submit'>
    {% endif %}
</form>

【问题讨论】:

    标签: django django-views django-forms formset


    【解决方案1】:

    使用formset = ServiceFormset,您不是在views.py 中实例化一个表单集,而是定义一个FormSet 类。

    使用formset = ServiceFormset() 实例化表单集。这允许您对其进行迭代。

    【讨论】:

    • 你忘了这一点,但没有改变
    猜你喜欢
    • 2021-04-03
    • 2013-07-09
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多