タイトルとファイルという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節では、私の質問
エラーが表示されます。私は、選択肢のリストから正しいsmallPositiveInteger値を使ってドロップダウンを使用しています。なぜ私は見ているのですか?「有効な選択肢を選択してください。 250は利用可能な選択肢の一つではありません.' ....と '以下のエラーを修正してください - 必要なフィールドがすべて完成していることを確認してください。 '他のすべての分野のために? Djangoはドロップダウンが気に入らないのですか?モデルで別のフィールドタイプを選択する必要がありますか? –
@SebastianSmolorz - これは、フィールドが整数を探しているが、選択肢はすべて文字列なので、提案されている2つのうちの1つを変更する – Sayse