Django documentationで、ModelFormのclean()メソッドがモデルのunique_together制約を検証し、検証されていない場合はValidationErrorが発生することを確認しました。しかし、私のModelFormはこれをしません。少なくとも、フォームにエラーメッセージが表示されず、Djangoエラーとトレースバックが発生します。私のDjango ModelFormがunique_together制約の検証エラーを発生させないのはなぜですか?
ValueError at /データが検証されなかったため、Jelentkezesを作成できませんでした。
これは、unique_together制約のフィールドの1つを除外したわけではありません。フォームの他の検証は、フォーム上でエラーメッセージを出します。助けてください、ありがとう!
私はDjango 1.10を使用し、Pythonは3.5です。モデルJelentkezesのために、私はforms.pyでのModelFormを作成している
from django.db import models
class FoglalkozasTipus(models.Model):
foglalkozas_tipusa = models.CharField(max_length=255, unique=True)
def __str__(self):
return '%s' % (self.foglalkozas_tipusa)
class Foglalkozas(models.Model):
kezdet = models.DateTimeField()
veg = models.DateTimeField()
foglalkozas_tipusa = models.ForeignKey(FoglalkozasTipus,
on_delete=models.CASCADE)
class Meta:
unique_together = (("kezdet", "veg"),)
ordering = ['kezdet', 'veg']
def __str__(self):
return '%s-%s %s' % (self.kezdet.strftime("%Y.%m.%d %H:%M"),
self.veg.strftime("%H:%M"), self.foglalkozas_tipusa)
class Jelentkezes(models.Model):
foglalkozas = models.ForeignKey(Foglalkozas, on_delete=models.CASCADE)
email = models.EmailField()
vezeteknev = models.CharField(max_length=255)
keresztnev = models.CharField(max_length=255)
class Meta:
unique_together = (("foglalkozas", "email"),)
def __str__(self):
return '%s: %s %s (%s)' % (self.foglalkozas, self.vezeteknev,
self.keresztnev, self.email)
:
はviews.pyでfrom django.utils import timezone
from django.forms import ModelForm, RadioSelect
from .models import Jelentkezes, Foglalkozas
class JelentkezesForm(ModelForm):
class Meta:
model = Jelentkezes
fields = ['foglalkozas', 'email', 'vezeteknev', 'keresztnev']
widgets = {
'foglalkozas': RadioSelect,
}
def __init__(self, *args, **kwargs):
super(JelentkezesForm, self).__init__(*args, **kwargs)
self.fields['foglalkozas'].queryset =
Foglalkozas.objects.filter(kezdet__gt=timezone.now())
self.fields['foglalkozas'].empty_label = None
私はこれのModelFormを使用
私はmodels.pyで、次のモデルを作成しました:フォームはこのようになりますindex.htmlをで
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import JelentkezesForm
def index(request):
if request.method == 'POST':
form = JelentkezesForm(request.POST)
form.save()
return HttpResponseRedirect('koszonet/')
else:
form = JelentkezesForm()
return render(request, 'aviva/index.html', {'form': form})
(私はW3.CSSフレームワークとジャンゴ・ウィジェットを使用スタイリングのための-tweaks):
{% load widget_tweaks %}
<form action="" method="post">
{% csrf_token %}
{{ form.non_field_errors }}
{{ form.foglalkozas.errors }}
<label class="w3-label" for="{{ form.foglalkozas.id_for_label }}"><b>{{ form.foglalkozas.label }}:</b></label>
{% for radio in form.foglalkozas %}
<div class="w3-radio">
{{ radio }}
</div>
{% endfor %}
{{ form.email.errors }}
<label class="w3-label" for="{{ form.email.id_for_label }}"><b>{{ form.email.label }}:</b></label>
{{ form.email|add_class:"w3-input w3-border w3-round" }}
{{ form.vezeteknev.errors }}
<label class="w3-label" for="{{ form.vezeteknev.id_for_label }}"><b>{{ form.vezeteknev.label }}:</b></label>
{{ form.vezeteknev|add_class:"w3-input w3-border w3-round" }}
{{ form.keresztnev.errors }}
<label class="w3-label" for="{{ form.keresztnev.id_for_label }}"><b>{{ form.keresztnev.label }}:</b></label>
{{ form.keresztnev|add_class:"w3-input w3-border w3-round" }}
<p><input type="submit" class="w3-btn w3-blue w3-left w3-border" value="Jelentkezés elküldése" />
<button type="reset" class="w3-btn w3-yellow w3-right w3-border" value="Reset">Űrlapadatok törlése</button></p>
</form>
これは他の検証エラーでもあります。なぜ完全なスタックトレースを投稿しないでください – e4c5