Mein Modell funktionierte perfekt, als ich zwei Felder hatte: Titel und Datei. Ich habe beschlossen, einige zusätzliche Felder zu meinem Modell hinzuzufügen und jetzt kann ich form.is_valid()
nicht erhalten, um wahr zurückzukommen.Django 1.9 form.is_valid schlägt auf ModelForm fehl
Ansicht
def upload_view(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
print request.POST
print request.FILES
if form.is_valid():
print "Form valid"
upload = form.save()
path = change_name(upload)
runscript.delay(upload.pk, (str(upload.author.id) + '_' + str(upload.id)), path, setting, permutations, biohel_runs, attributes)
return render(request, 'upload/submitted.html', {'title': upload.title, 'link': 'job/' + str(upload.id)})
else:
form = UploadFileForm()
return render(request, 'upload/upload_view.html', {'error': "Sorry, try submitting your form again", 'form': form})
else:
form = UploadFileForm()
return render(request, 'upload/upload_view.html', {'form': form})
Vorlage
{{ error }}
{{ form.errors }}
{% if form.non_field_errors or form.errors %}
<div class="error-list-block">
<p>
Please correct the errors below - Ensure all required fields
are completed.
</p>
<ul>
{% for error in form.non_field_errors|add:form.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<form class="upload" method="post" action="../upload/" enctype="multipart/form-data">{% csrf_token %}
<label for="{{ form.title.id_for_label }}">{{ form.title.label }}</label>
{{ form.title }}
<span style="margin:0 auto;"><label for="{{ form.file.id_for_label }}">{{ form.file.label }}</label>
{{ form.file }}</span>
<div style="margin:10px auto;">
<label for="{{ form.setting.id_for_label }}">{{ form.setting.label }}</label>
{{ form.setting }}
<label for="{{ form.permutations.id_for_label }}">{{ form.permutations.label }}</label>
{{ form.permutations }}
<label for="{{ form.biohel_runs.id_for_label }}">{{ form.biohel_runs.label }}</label>
{{ form.biohel_runs }}
<label for="{{ form.attributes.id_for_label }}">{{ form.attributes.label }}</label>
{{ form.attributes }}
</div>
Modell
class Upload(models.Model):
SETTING = (
('1', '1'),
('2', '2'),
('3', '3'),
('4', '4'),
)
PERMUTATIONS = (
('10', '10'),
('50', '50'),
('100', '100'),
('200', '200'),
)
BIOHEL = (
('250', '250'),
('500', '500'),
('1000', '1000'),
('2500', '2500'),
)
ATTRIBUTES = (
('10', '10'),
('50', '50'),
('100', '100'),
('200', '200'),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
title = models.CharField(max_length=20)
#TODO - change status to be a text field and merge with error
status = models.BooleanField(default=False)
error = models.BooleanField(default=False)
submit_date = models.DateTimeField(
default=timezone.now)
start_date = models.DateTimeField(
blank=True, null=True)
finish_date = models.DateTimeField(
blank=True, null=True)#TODO change to unique name
file = models.FileField(upload_to='experiments', null=True)
result = models.FileField(null=True)
setting = models.PositiveSmallIntegerField(default=1, choices=SETTING)
permutations = models.PositiveSmallIntegerField(default=10, choices=PERMUTATIONS)
biohel_runs = models.PositiveSmallIntegerField(default=250, choices=BIOHEL)
attributes = models.PositiveSmallIntegerField(default=10, choices=ATTRIBUTES)
Formular
from django import forms
from .models import Upload
class UploadFileForm(forms.ModelForm):
class Meta:
model = Upload
fields = ('title', 'file', 'setting', 'permutations', 'biohel_runs', 'attributes')
Wenn ich ein vollständig gültiges Formular einreiche, kann ich es nicht bestätigen. Keine Fehlerbehandlung in der Vorlage zeigt Fehler an. Hier ist der Ausdruck der POST- und FILE-Werte. Wie Sie sehen können, fehlt nichts! Um es zu wiederholen, es funktioniert, wenn ich nur die zwei Felder habe: Titel und Datei.
<QueryDict: {u'title': [u'sadsda'], u'biohel_runs': [u'250'], u'permutations': [u'10'], u'setting': [u'1'], u'attributes': [u'10'], u'csrfmiddlewaretoken': [u'EntGKVQhYqjnxYTIh6v8135Ic3JHZPRw']}>
<MultiValueDict: {u'file': [<InMemoryUploadedFile: 1_652a60b7-ff84-4b9d-bac0-623417de3d9d.arff (application/octet-stream)>]}>
Vielen Dank für die Zeit nehmen, meine Frage
Ich sehe die Fehler jetzt. Ich verwende ein Dropdown-Menü mit den richtigen SmallPositiveInteger-Werten aus einer Auswahlliste. Warum sehe ich dann: 'Wähle eine gültige Auswahl. 250 ist keine der verfügbaren Optionen. ".... und' Bitte korrigieren Sie die Fehler unten - Stellen Sie sicher, dass alle erforderlichen Felder ausgefüllt sind. 'für alle anderen Felder? Mag Django Dropdowns nicht? Sollte ich in meinem Modell einen anderen Feldtyp auswählen? –
@SebastianSmolorz - Das ist, weil Sie Felder für ganze Zahlen suchen, aber Ihre Entscheidungen sind alle Zeichenfolgen, ändern Sie eines der beiden vorgeschlagenen Dinge – Sayse