Набор форм Django Model работает частично
Обычно у меня простой вопрос, но я не могу заставить его работать. У меня есть представление, в котором клиенты могут добавлять, удалять или редактировать свои адреса.
view.py:
customer_addresses = CustomerAddresses.objects.filter(CustomerID=customer)
AddressFormSet = modelformset_factory(CustomerAddresses, form=CustomerAddressesForm, extra=0)
formset = AddressFormSet(queryset=customer_addresses, form_kwargs={'user': User.ID})
if request.method == 'POST':
if 'add_address' in request.POST:
add_address_form = CustomerAddressesForm(User.ID, request.POST)
if add_address_form.is_valid():
add_address_form.save()
if 'edit_address' in request.POST:
address_id = request.POST.get('id_Address')
address_data = CustomerAddresses.objects.get(pk=address_id)
edit_address_form = AddressFormSet(request.POST, queryset=customer_addresses, form_kwargs={'user': User.ID})
print('ERROR', edit_address_form.errors)
messages.error(request, 'ERROR')
if edit_address_form.is_valid():
instances = edit_address_form.save(commit=False)
for instance in instances:
instance.save()
return redirect('addresses')
if 'delete_customer_address_id' in request.POST:
delete_customer_address_id = request.POST.get('delete_customer_address_id')
request.session['delete_customer_address_id'] = delete_customer_address_id
return redirect('delete-customer-address')
if 'register_customer' in request.POST:
register_form = CustomerAddressesForm(user=user_id)
if register_form.is_valid():
customer = register_form.save(commit=False)
customer.UserID = user_id
customer.save()
# You can redirect to a success page or login the user directly
redirect(request.META.get('HTTP_REFERER'))
else:
add_address_form = CustomerAddressesForm(user=User.ID)
и моя форма:
class CustomerAddressesForm(forms.ModelForm):
Title = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control mb-3', 'autofocus': True}),
required=False)
Address_Firstname = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}))
Address_Lastname = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}))
Zip = forms.IntegerField(
widget=forms.TextInput(attrs={'class': 'form-control', 'maxlength': '5', 'data-toggle': 'maxlength'}),
label='Postnummer')
City = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}))
Address_Company = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}),
required=False)
Street = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}), required=False)
Country = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-select'}),
queryset=CountryList.objects.values_list('countryname', flat=True).order_by(
'code'), initial='Denmark', to_field_name='countryname')
Is_Default_Shipping_address = forms.BooleanField(
widget=forms.CheckboxInput(attrs={'class': 'form-check-input', 'id': 'customSwitch4'}), initial=False,
required=False)
Is_Default_Billing_address = forms.BooleanField(
widget=forms.CheckboxInput(attrs={'class': 'form-check-input', 'id': 'customSwitch3'}), initial=False,
required=False)
class Meta:
model = CustomerAddresses
fields = ['Title', 'Address_Firstname', 'Address_Lastname', 'Zip', 'City', 'Address_Company', 'Country',
'Is_Default_Shipping_address', 'Is_Default_Billing_address', 'Address_CustomerSalutation',
'CustomerID', 'Street']
def __init__(self, user, *args, **kwargs):
super(CustomerAddressesForm, self).__init__(*args, **kwargs)
self.fields['Address_CustomerSalutation'] = forms.ModelChoiceField(
widget=forms.Select(attrs={'class': 'form-select mb-3'}),
queryset=Salutation.objects.filter(UserID_id=user), empty_label=None)
Итак, формы генерируются, и я могу открыть форму edit_customer_form, значения заполняются, потому что запрос установлен. Но если я нажимаю на сохранить, форма публикуется, она прыгает в правом цикле: if 'edit_address' in request.POST: но я получил вывод: print('ERROR', edit_address_form.errors)
что все поля обязательны для заполнения, а ввода данных нет. Это странно.
HTML-форма выглядит следующим образом:
<input type="text" name="form-0-Address_Firstname" value="Christopher" class="form-control" autofocus="" id="id_form-0-Address_Firstname">
Ошибка гласит:
ERROR [{'CustomerID': ['Dette felt er påkrævet.'], 'ID': ['Dette felt er påkrævet.']}, {'Address_Firstname': ['Dette felt er påkrævet.'],
В моих глазах имя поля отличается от значения, заданного префиксом, что необходимо. Но как я могу сохранить форму и придать ей значения.
уважает Кристофер.
Я нашел проблему, это было недоразумение, я создал для каждого экземпляра собственный тег <form>
, это не работало, потому что
{{ formset.management_form }}
должны быть в форме для всех наборов форм.
Я тоже пробовал
{{ form.instance.management_form }}
и
{{ form.management_form }}
в цикле {% for form in formset %}
, но это не помогло. Я также исключил поле CustomerID, потому что оно не будет изменено ни клиентом, ни администратором.