2016-04-19 14 views
1

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

Antwort

4

In der else-Klausel zu lesen, Sie alle Verweise auf eventuelle Fehler entfernen, die Ihre Form erzeugt tatsächlich durch eine neue Instanz des Formulars auf Ihre Variablen zugewiesen wird. so müssen Sie dieses

else: 
    form = UploadFileForm() # Remove me! 

Theres kein anderes Problem mit Ihrem Code zu entfernen, das Formular einfach nicht gültig ist.


Wie sich herausstellt man auch die vier Felder dort als PositiveIntegerFields haben, aber ihre Entscheidungen sind alle Saiten so entweder die Felder zu einem CharField ändern oder die Wahl integer sein

(10, '10'), 

usw. ändern

+0

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? –

+0

@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