2016-04-19 24 views
1

タイトルとファイルという2つのフィールドがあると、私のモデルフォームが完全に機能しました。モデルフォームにフィールドを追加することにしましたが、今度はform.is_valid()をtrueに戻すことができません。Django 1.9 form.is_validがModelFormで失敗する

ビュー

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}) 

テンプレート

{{ 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> 

モデル

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) 

フォーム

from django import forms 

from .models import Upload 

class UploadFileForm(forms.ModelForm): 

    class Meta: 
     model = Upload 
     fields = ('title', 'file', 'setting', 'permutations', 'biohel_runs', 'attributes') 

完全に有効なフォームを提出すると、検証することができません。テンプレート内のエラー処理のいずれもエラーを表示しません。 POSTとFILEの値を出力します。あなたが見ることができるので、何も見当たりません!繰り返しますが、タイトルとファイルという2つのフィールドしか持たないときに動作します。

<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)>]}> 

あなたのフォームが実際にあなたの変数に、フォームの新しいインスタンスを割り当てることによって生成されたエラーへのすべての参照を削除し、else節では、私の質問

答えて

4

を読むために時間を割いていただき、ありがとうございます。 ので、あなたがこの

else: 
    form = UploadFileForm() # Remove me! 

を削除する必要があるが、フォームだけで有効ではありません、あなたのコードを持つ他の問題をtheresの。


は、それはあなたにもPositiveIntegerFieldsとしてそこに4つのフィールドを持っている結局のところしかし

(10, '10'), 

などを整数にCharFieldにフィールドを変更したり、選択を変更するのいずれかのように、彼らの選択は、すべての文字列です

+0

エラーが表示されます。私は、選択肢のリストから正しいsmallPositiveInteger値を使ってドロップダウンを使用しています。なぜ私は見ているのですか?「有効な選択肢を選択してください。 250は利用可能な選択肢の一つではありません.' ....と '以下のエラーを修正してください - 必要なフィールドがすべて完成していることを確認してください。 '他のすべての分野のために? Djangoはドロップダウンが気に入らないのですか?モデルで別のフィールドタイプを選択する必要がありますか? –

+0

@SebastianSmolorz - これは、フィールドが整数を探しているが、選択肢はすべて文字列なので、提案されている2つのうちの1つを変更する – Sayse

関連する問題