Form.as_p 工作正常,但个别表单字段未正确提交
Form.as_p works fine but individual form fields is not submitting correctly
我之前通过使用 form.as_p 导入我的表单来设置我的模板,它工作正常。但是,我需要指定每个字段,因为我有一个我不希望用户看到的字段(我需要在我的 django 管理中包含它,所以我不能将它从表单中排除)。
但是,当我用它的各个字段设置表单并提交时,我没有被重定向,我只是返回到已填写的表单。
我已经设置了一些打印字段,也尝试在 form_invalid 中打印但是什么也没有显示,我不知道是什么问题。有人可以建议如何解决这个问题或以其他方式解决吗?
模板中的表单
<form method="post" enctype="multipart/form-data" id="adForm" data-municipalities-url="{% url 'ajax_load_municipalities' %}" data-areas-url="{% url 'ajax_load_areas' %}" novalidate>
{% csrf_token %}
<!-- {{ form.as_p }} -->
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.province.errors }}
{{ form.province.label_tag }}
{{ form.province }}
</div>
<div class="fieldWrapper">
{{ form.municipality.errors }}
{{ form.municipality.label_tag }}
{{ form.municipality }}
</div>
<div class="fieldWrapper">
{{ form.area.errors }}
{{ form.area.label_tag }}
{{ form.area }}
</div>
<div class="fieldWrapper">
{{ form.name.errors }}
{{ form.name.label_tag }}
{{ form.name }}
</div>
<div class="fieldWrapper">
{{ form.age.errors }}
{{ form.age.label_tag }}
{{ form.age }}
</div>
<div class="fieldWrapper">
{{ form.title.errors }}
{{ form.title.label_tag }}
{{ form.title }}
</div>
<div class="fieldWrapper">
{{ form.description.errors }}
{{ form.description.label_tag }}
{{ form.description }}
</div>
<div class="fieldWrapper">
{{ form.days_per_week.errors }}
{{ form.days_per_week.label_tag }}
{{ form.days_per_week }}
</div>
<div class="fieldWrapper">
{{ form.hundras.errors }}
{{ form.hundras.label_tag }}
{{ form.hundras }}
</div>
<div class="fieldWrapper">
{{ form.size_offered.errors }}
{{ form.size_offered.label_tag }}
{{ form.size_offered }}
</div>
<div class="fieldWrapper">
{{ form.image1.errors }}
{{ form.image1.label_tag }}
{{ form.image1 }}
</div>
<div class="fieldWrapper">
{{ form.image2.errors }}
{{ form.image2.label_tag }}
{{ form.image2 }}
</div>
<div class="fieldWrapper">
{{ form.image3.errors }}
{{ form.image3.label_tag }}
{{ form.image3 }}
</div>
<div class="fieldWrapper">
{{ form.payment_type.errors }}
{{ form.payment_type.label_tag }}
{{ form.payment_type }}
</div>
<button type="submit">Publicera annons</button>
</form>
景色
class NewAdTakeMyDog(CreateView):
model = Advertisement
form_class = NewAdTakeMyDogForm
template_name = 'core/advertisement_form_take.html'
success_url = reverse_lazy('view_ads_take_my_dog')
def __init__(self):
print('init')
self.pk = None
def form_valid(self, form):
print('Form valid')
form.instance.author = self.request.user
form.instance.is_offering_own_dog = True
form.instance.is_published = False
response = super().form_valid(form)
return response
def get_success_url(self):
print('Get success url')
if self.object.payment_type == 'S':
return reverse('swish_payment_template', kwargs={'pk': self.object.pk})
if self.object.payment_type == 'B':
return reverse('bg_payment', kwargs={'pk': self.object.pk})
forms.py
class NewAdTakeMyDogForm(forms.ModelForm):
CHOICES = [('S',f'Swish - {PRICE_SWISH}'),('B',f'Bankgiro - {PRICE_BANKGIRO}')]
payment_type = forms.CharField(label='Betalsätt', widget=forms.RadioSelect(choices=CHOICES))
hundras = forms.ModelChoiceField(
queryset=DogBreeds.objects.all(),
widget=autocomplete.ModelSelect2(url='breed-autocomplete')
)
class Meta:
model = Advertisement
fields = ('author', 'province', 'municipality', 'area', 'title', 'name', 'age', 'description', 'days_per_week', 'size_offered', 'hundras', 'image1', 'image2', 'image3', 'payment_type')
def __init__(self, *args, **kwargs):
super(NewAdTakeMyDogForm, self).__init__(*args, **kwargs)
self.fields['municipality'].queryset = Municipality.objects.none()
self.fields['area'].queryset = Area.objects.none()
self.fields['area'].required = False
if 'province' in self.data:
try:
# Set municipality queryset
province_id = int(self.data.get('province'))
self.fields['municipality'].queryset = Municipality.objects.filter(province_id=province_id).order_by('name')
# Set area queryset
municipality_id = int(self.data.get('municipality'))
self.fields['area'].queryset = Area.objects.filter(municipality_id=municipality_id).order_by('name')
except (ValueError, TypeError) as e:
pass # invalid input from the client; ignore and fallback to empty Municipality/Area queryset
我最终通过创建一个用于管理界面的附加表单解决了这个问题。
我还通过以下方式获得了脆皮表格:
{{form|crispy}}
而不是:
{% crispy form %}
我之前通过使用 form.as_p 导入我的表单来设置我的模板,它工作正常。但是,我需要指定每个字段,因为我有一个我不希望用户看到的字段(我需要在我的 django 管理中包含它,所以我不能将它从表单中排除)。
但是,当我用它的各个字段设置表单并提交时,我没有被重定向,我只是返回到已填写的表单。
我已经设置了一些打印字段,也尝试在 form_invalid 中打印但是什么也没有显示,我不知道是什么问题。有人可以建议如何解决这个问题或以其他方式解决吗?
模板中的表单
<form method="post" enctype="multipart/form-data" id="adForm" data-municipalities-url="{% url 'ajax_load_municipalities' %}" data-areas-url="{% url 'ajax_load_areas' %}" novalidate>
{% csrf_token %}
<!-- {{ form.as_p }} -->
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.province.errors }}
{{ form.province.label_tag }}
{{ form.province }}
</div>
<div class="fieldWrapper">
{{ form.municipality.errors }}
{{ form.municipality.label_tag }}
{{ form.municipality }}
</div>
<div class="fieldWrapper">
{{ form.area.errors }}
{{ form.area.label_tag }}
{{ form.area }}
</div>
<div class="fieldWrapper">
{{ form.name.errors }}
{{ form.name.label_tag }}
{{ form.name }}
</div>
<div class="fieldWrapper">
{{ form.age.errors }}
{{ form.age.label_tag }}
{{ form.age }}
</div>
<div class="fieldWrapper">
{{ form.title.errors }}
{{ form.title.label_tag }}
{{ form.title }}
</div>
<div class="fieldWrapper">
{{ form.description.errors }}
{{ form.description.label_tag }}
{{ form.description }}
</div>
<div class="fieldWrapper">
{{ form.days_per_week.errors }}
{{ form.days_per_week.label_tag }}
{{ form.days_per_week }}
</div>
<div class="fieldWrapper">
{{ form.hundras.errors }}
{{ form.hundras.label_tag }}
{{ form.hundras }}
</div>
<div class="fieldWrapper">
{{ form.size_offered.errors }}
{{ form.size_offered.label_tag }}
{{ form.size_offered }}
</div>
<div class="fieldWrapper">
{{ form.image1.errors }}
{{ form.image1.label_tag }}
{{ form.image1 }}
</div>
<div class="fieldWrapper">
{{ form.image2.errors }}
{{ form.image2.label_tag }}
{{ form.image2 }}
</div>
<div class="fieldWrapper">
{{ form.image3.errors }}
{{ form.image3.label_tag }}
{{ form.image3 }}
</div>
<div class="fieldWrapper">
{{ form.payment_type.errors }}
{{ form.payment_type.label_tag }}
{{ form.payment_type }}
</div>
<button type="submit">Publicera annons</button>
</form>
景色
class NewAdTakeMyDog(CreateView):
model = Advertisement
form_class = NewAdTakeMyDogForm
template_name = 'core/advertisement_form_take.html'
success_url = reverse_lazy('view_ads_take_my_dog')
def __init__(self):
print('init')
self.pk = None
def form_valid(self, form):
print('Form valid')
form.instance.author = self.request.user
form.instance.is_offering_own_dog = True
form.instance.is_published = False
response = super().form_valid(form)
return response
def get_success_url(self):
print('Get success url')
if self.object.payment_type == 'S':
return reverse('swish_payment_template', kwargs={'pk': self.object.pk})
if self.object.payment_type == 'B':
return reverse('bg_payment', kwargs={'pk': self.object.pk})
forms.py
class NewAdTakeMyDogForm(forms.ModelForm):
CHOICES = [('S',f'Swish - {PRICE_SWISH}'),('B',f'Bankgiro - {PRICE_BANKGIRO}')]
payment_type = forms.CharField(label='Betalsätt', widget=forms.RadioSelect(choices=CHOICES))
hundras = forms.ModelChoiceField(
queryset=DogBreeds.objects.all(),
widget=autocomplete.ModelSelect2(url='breed-autocomplete')
)
class Meta:
model = Advertisement
fields = ('author', 'province', 'municipality', 'area', 'title', 'name', 'age', 'description', 'days_per_week', 'size_offered', 'hundras', 'image1', 'image2', 'image3', 'payment_type')
def __init__(self, *args, **kwargs):
super(NewAdTakeMyDogForm, self).__init__(*args, **kwargs)
self.fields['municipality'].queryset = Municipality.objects.none()
self.fields['area'].queryset = Area.objects.none()
self.fields['area'].required = False
if 'province' in self.data:
try:
# Set municipality queryset
province_id = int(self.data.get('province'))
self.fields['municipality'].queryset = Municipality.objects.filter(province_id=province_id).order_by('name')
# Set area queryset
municipality_id = int(self.data.get('municipality'))
self.fields['area'].queryset = Area.objects.filter(municipality_id=municipality_id).order_by('name')
except (ValueError, TypeError) as e:
pass # invalid input from the client; ignore and fallback to empty Municipality/Area queryset
我最终通过创建一个用于管理界面的附加表单解决了这个问题。
我还通过以下方式获得了脆皮表格:
{{form|crispy}}
而不是:
{% crispy form %}