Django:如何使表格有条件?
Django: How to make form conditional?
我有一个包含两个字段的表单。应该只要求用户 select 两者之一。两者都不是,也不是 none。
我尝试通过覆盖 Django Doc 中描述的 clean 方法来解决这个问题:
forms.py
class ConfigureWorkout(forms.Form):
first_exercise = forms.ModelChoiceField(empty_label="select", label="Choose First Exercise", queryset=FirstExercise.objects.all(), required=False)
sec_exercise = forms.ModelChoiceField(empty_label="select", label="Choose Sec Exercise", queryset=SecExercise.objects.all(), required=False)
def clean(self):
first_exercise = self.cleaned_data.get("first_exercise")
sec_exercise = self.cleaned_data.get("sec_exercise")
if first_exercise and sec_exercise:
raise forms.ValidationError("Enter either a First Exercise or a Secondary Exercise.")
else:
return self.cleaned_data
views.py
def configure(request):
configure_workout = ConfigureWorkout()
if request.method == "GET":
return render(request, "userprofile/some.html", configure_workout)
else:
return render(request, "app/other.html")
模板
<form action="{% url 'configure' %}" method="POST">
{% csrf_token %}
{{ configure_workout }}
<input type="submit" name="configuration_completed">
</form>
但是,如果我通过 select 对表单中的两个字段进行测试,将不会出现错误 displayed/raised。我成功通过了表格并被发送到“other.html”。
我错过了什么?
非常感谢您的帮助:)
您似乎没有将实际数据传递到您的表单。也许这会有所帮助:
def configure(request):
configure_workout = ConfigureWorkout()
if request.method == "GET":
return render(request, "userprofile/some.html", configure_workout)
else:
configure_workout = ConfigureWorkout(request.POST)
configure_workout.is_valid()
configure_workout.clean()
return render(request, "app/other.html")
基于@trafalinos 的回答并查看 Forms 上的文档,我建议执行以下操作:
在forms.py
中:
class ConfigureWorkout(forms.Form):
first_exercise = forms.ModelChoiceField(empty_label="select", label="Choose First Exercise", queryset=FirstExercise.objects.all(), required=False)
sec_exercise = forms.ModelChoiceField(empty_label="select", label="Choose Sec Exercise", queryset=SecExercise.objects.all(), required=False)
def clean(self):
cleaned_data = super().clean() # compare documentation
first_exercise = cleaned_data.get("first_exercise")
sec_exercise = cleaned_data.get("sec_exercise")
if first_exercise and sec_exercise:
raise forms.ValidationError("Enter either a First Exercise or a Secondary Exercise.")
else:
return self.cleaned_data
并且(感谢 trafalino)在 views.py
:
def configure(request):
if request.method == "GET":
configure_workout = ConfigureWorkout()
return render(request, "userprofile/some.html", configure_workout)
else:
configure_workout = ConfigureWorkout(request.POST)
configure_workout.clean()
return render(request, "app/other.html")
我有一个包含两个字段的表单。应该只要求用户 select 两者之一。两者都不是,也不是 none。 我尝试通过覆盖 Django Doc 中描述的 clean 方法来解决这个问题:
forms.py
class ConfigureWorkout(forms.Form):
first_exercise = forms.ModelChoiceField(empty_label="select", label="Choose First Exercise", queryset=FirstExercise.objects.all(), required=False)
sec_exercise = forms.ModelChoiceField(empty_label="select", label="Choose Sec Exercise", queryset=SecExercise.objects.all(), required=False)
def clean(self):
first_exercise = self.cleaned_data.get("first_exercise")
sec_exercise = self.cleaned_data.get("sec_exercise")
if first_exercise and sec_exercise:
raise forms.ValidationError("Enter either a First Exercise or a Secondary Exercise.")
else:
return self.cleaned_data
views.py
def configure(request):
configure_workout = ConfigureWorkout()
if request.method == "GET":
return render(request, "userprofile/some.html", configure_workout)
else:
return render(request, "app/other.html")
模板
<form action="{% url 'configure' %}" method="POST">
{% csrf_token %}
{{ configure_workout }}
<input type="submit" name="configuration_completed">
</form>
但是,如果我通过 select 对表单中的两个字段进行测试,将不会出现错误 displayed/raised。我成功通过了表格并被发送到“other.html”。
我错过了什么? 非常感谢您的帮助:)
您似乎没有将实际数据传递到您的表单。也许这会有所帮助:
def configure(request):
configure_workout = ConfigureWorkout()
if request.method == "GET":
return render(request, "userprofile/some.html", configure_workout)
else:
configure_workout = ConfigureWorkout(request.POST)
configure_workout.is_valid()
configure_workout.clean()
return render(request, "app/other.html")
基于@trafalinos 的回答并查看 Forms 上的文档,我建议执行以下操作:
在forms.py
中:
class ConfigureWorkout(forms.Form):
first_exercise = forms.ModelChoiceField(empty_label="select", label="Choose First Exercise", queryset=FirstExercise.objects.all(), required=False)
sec_exercise = forms.ModelChoiceField(empty_label="select", label="Choose Sec Exercise", queryset=SecExercise.objects.all(), required=False)
def clean(self):
cleaned_data = super().clean() # compare documentation
first_exercise = cleaned_data.get("first_exercise")
sec_exercise = cleaned_data.get("sec_exercise")
if first_exercise and sec_exercise:
raise forms.ValidationError("Enter either a First Exercise or a Secondary Exercise.")
else:
return self.cleaned_data
并且(感谢 trafalino)在 views.py
:
def configure(request):
if request.method == "GET":
configure_workout = ConfigureWorkout()
return render(request, "userprofile/some.html", configure_workout)
else:
configure_workout = ConfigureWorkout(request.POST)
configure_workout.clean()
return render(request, "app/other.html")