我有一个django表单InstellingenForm,它有几个输入字段。所有这些都应该是必需的。但根据"spelmodus“的输入,"tijd”或"woorden“应转换为required=False。(如果在"spelmodus“中选择了"tijd”,则"woorden“形式应更改为required=False,反之亦然)我尝试使用一个clean()函数来完成此操作,但我似乎想不出如何准确地完成此操作。
forms.py:
from django import forms
SPELMODUS = [
("", ""),
('tijd', 'Tijd'),
('woorden', 'Woorden'),
]
TIJD = [
("", ""),
('een', '1 minuut'),
('twee', '2 minuten'),
('vijf', '5 minuten'),
]
WOORDEN = [
("", ""),
('vijftig', '50 woorden'),
('honderd', '100 woorden'),
('honderdvijftig', '150 woorden'),
]
TALEN = [
("", ""),
('nederlands', 'Nederlands'),
('engels', 'Engels'),
]
MOEILIJKHEID = [
("", ""),
('makkelijk', 'Makkelijk'),
('gemiddeld', 'Gemiddeld'),
('moeilijk', 'Moeilijk'),
]
class InstellingenForm(forms.Form):
naam = forms.CharField(label="Naam", max_length=10, required=True, widget=forms.TextInput(attrs={'class': 'input-container'}))
spelmodus = forms.ChoiceField(label="Spelmodus", choices=SPELMODUS, required=True, widget=forms.Select(attrs={'class': 'input-container', 'id': 'spelmodus', 'onchange': 'hideShow(this.value)', }))
tijd = forms.ChoiceField(label="", choices=TIJD, widget=forms.Select(attrs={'class': 'input-container', 'id': 'tijdClass'}))
woorden = forms.ChoiceField(label="", choices=WOORDEN, widget=forms.Select(attrs={'class': 'input-container', 'id': 'woordenClass'}))
taal = forms.ChoiceField(label="Taal", choices=TALEN, required=True, widget=forms.Select(attrs={'class': 'input-container'}))
moeilijkheid = forms.ChoiceField(label="Moeilijkheid", choices=MOEILIJKHEID, required=True, widget=forms.Select(attrs={'class': 'input-container'}))
def clean(self):
if self.data.get('spelmodus', 'tijd'):
self.fields['woorden'].required = False
elif self.data.get('spelmodus', 'woorden'):
self.fields['tijd'].required = False
super(InstellingenForm, self)._clean_fields()views.py:
def instellingenDatabase(request):
if request.method == "POST":
form = InstellingenForm(request.POST)
if form.is_valid():
return HttpResponseRedirect('/')
rendered = render(request, 'instellingenDatabase.html', {
'formulier': form
})
return HttpResponse(rendered)instellingenDatabase.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'instellingen.css' %}">
<script type='text/javascript' src="{% static 'instellingen.js' %}"></script>
</head>
<body>
{% include "header.html" %}
<div class="bodypage">
<div class="settings-container">
<div class="playText">
Play
</div>
<form method="post">
{% csrf_token %}
<table>
{% for field in formulier %}
{{ field.label }}
{{ field }}
{% endfor %}
</table>
<br>
<button type="submit" name="Start" value="Start" class="button">Start</button>
</form>
</div>
</div>
</body>
</html>发布于 2021-05-11 19:27:35
您的方法不起作用,因为在调用clean之前已经清除了字段。对于您可能想要对表单进行的这些类型的更改,应改写__init__。
class InstellingenForm(forms.Form):
naam = forms.CharField(label="Naam", max_length=10, required=True, widget=forms.TextInput(attrs={'class': 'input-container'}))
spelmodus = forms.ChoiceField(label="Spelmodus", choices=SPELMODUS, required=True, widget=forms.Select(attrs={'class': 'input-container', 'id': 'spelmodus', 'onchange': 'hideShow(this.value)', }))
tijd = forms.ChoiceField(label="", choices=TIJD, widget=forms.Select(attrs={'class': 'input-container', 'id': 'tijdClass'}))
woorden = forms.ChoiceField(label="", choices=WOORDEN, widget=forms.Select(attrs={'class': 'input-container', 'id': 'woordenClass'}))
taal = forms.ChoiceField(label="Taal", choices=TALEN, required=True, widget=forms.Select(attrs={'class': 'input-container'}))
moeilijkheid = forms.ChoiceField(label="Moeilijkheid", choices=MOEILIJKHEID, required=True, widget=forms.Select(attrs={'class': 'input-container'}))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if 'spelmodus' in self.data:
spelmodus = self.data.get('spelmodus')
if spelmodus == 'tijd':
self.fields['woorden'].required = False
elif spelmodus == 'woorden':
self.fields['tijd'].required = False此外,您从未在视图中使用过该表单。您只需将其传递给上下文并呈现它。如果要检查表单是否有效,则需要使用is_valid方法。您已经在编辑中添加了这一点,但现在您从未在GET请求的情况下创建表单,您也需要这样做:
def instellingenDatabase(request):
if request.method == "POST":
form = InstellingenForm(request.POST)
if form.is_valid():
print(form.cleaned_data.get('spelmodus')) # Check value of spelmodus
return HttpResponseRedirect('/')
print(form.errors) # print errors here in case form is invalid
else:
form = InstellingenForm() # instantiate form in case of GET request
rendered = render(request, 'instellingenDatabase.html', {
'formulier': form
})
return HttpResponse(rendered)此外,当您手动呈现表单时,最好也呈现错误,因为这样用户就可以知道哪里出了问题:
{% for field in formulier %}
{{ field.label }}
{{ field }}
{{ field.errors }}
{% endfor %}
{{ formulier.non_field_errors }}https://stackoverflow.com/questions/67485380
复制相似问题