2016-12-11 9 views
1

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> 
+0

これは他の検証エラーでもあります。なぜ完全なスタックトレースを投稿しないでください – e4c5

答えて

0

あなたは、フォーム上の検証を呼び出すことはありません。それは次のようになります。

if request.method == 'POST': 
    form = JelentkezesForm(request.POST) 
    if form.is_valid(): 
     form.save() 
     return HttpResponseRedirect('koszonet/') 
+0

ありがとう、これは動作します!どういうわけか私は何かを誤解しており、これは必要ではないと私は考えました。 – sgd

関連する問題