2017-12-21 55 views
0

フォームの名前が既にデータベースに存在するかどうかをチェックする方法を調べてみました。私はthis linkを使って方法を見つけ出しました。実際に重複した名前を入力することはできません。しかし私が期待したところでは、エラーメッセージは出ませんでした。私はここで間違っているのか分からないので、誰かが私に何をすべきか教えてくれれば、それは本当に便利だろう!django 1.11 raise forms.validationError htmlのエラーが表示されない

addgame.html:

<form method="POST" class="post-form" enctype="multipart/form-data"> 
      {% csrf_token %} 
      {% if form.non_field_errors %} 
       {% for error in form.non_field_errors %} 
       {{ error }} 
       {% endfor %} 
      {% endif %} 
      <div class="form-group"> 
      {{ form.name.label_tag }} 
      {% render_field form.name class="form-control" %} 
      <br> 
      {{ form.genre.label_tag }} 
      {% render_field form.genre class="form-control" %} 
      <br> 
      {{ form.image.label_tag }} 
      {{ form.image }} 
      </div> 
      <hr> 
      <button type="submit" class="save btn btn-primary">Save</button> 
     </form> 

views.py:

def addgame(request): 
if request.method == "POST": 
    form = InfoForm(request.POST, request.FILES) 
    if form.is_valid(): 
     infolist = form.save(commit=False) 
     infolist.created_date = timezone.now() 
     infolist.save() 
     return redirect('index') 
else: 
    form = InfoForm() 
return render(request, 'ranking/addgame.html', {'form': form}) 

forms.py:必要に応じて

class InfoForm(forms.ModelForm): 

class Meta: 
    model = GameInfo 
    fields = ('name', 'image', 'genre') 

def clean_name(self): 
    name = self.cleaned_data['name'] 
    try: 
     match = GameInfo.objects.get(name=name) 
    except GameInfo.DoesNotExist: 
     return name 
    raise forms.ValidationError('This game has already been added to the list.') 

わからないので、私は投稿しますmodels.py同様に:

class GameInfo(models.Model): 
GAME_CHOICE = [ 
    ("BMU", "Beat 'em up"), 
    ("FT", "Fighting"), 
    ("PF", "Platform"), 
    ("FPS", "Shooter"), 
    ("SV", "Survival"), 
    ("ST", "Stealth"), 
    ("AA", "Action Adventure"), 
    ("EX", "Exploring"), 
    ("SH", "Survival horror"), 
    ("IF", "Interactive fiction"), 
    ("IM", "Interactive movie"), 
    ("VN", "Visual novel"), 
    ("ARP", "Action role-playing"), 
    ("JRP", "Japanese role-playing"), 
    ("TRP", "Tactical role-playing"), 
    ("CAM", "Construction and management"), 
    ("LS", "Life simulation"), 
    ("SP", "Sports"), 
    ("VH", "Vehicle"), 
    ("MOBA", "Multiplayer online battle arena"), 
    ("RTS", "Real-time strategy"), 
    ("RTT", "Real-time tactics"), 
    ("TBS", "Turn-based strategy"), 
    ("TBT", "Turn-based tactics"), 
    ("MMORPG", "MMORPG"), 
    ("MMOFPS", "MMO-FPS"), 
    ("MMOR", "MMO Racing"), 
    ("CG", "Cardgame"), 
    ("PAC", "Point and Click"), 
    ("MG", "Music Game"), 
    ("VR", "Virtual Reality"), 
    ("RC", "Racing"), 
] 
name = models.CharField(max_length=100) 
created_date = models.DateTimeField(default=timezone.now) 
image = models.ImageField(upload_to='./media/images/') 
genre = models.CharField(
    max_length=6, 
    choices=GAME_CHOICE, 
    default="BMU", 
) 

def __str__(self): 
    return self.name 

class Meta: 
    ordering = ('name',) 

答えて

3

あなたがrendering the form fields manuallyしている場合、それは例えば、誤差を含んするのはあなた次第です:

{{ form.name.errors }} 
{{ form.name.label_tag }} 
{% render_field form.name class="form-control" %} 
+0

は「もしform.non_form_errors」の部分で取り扱わことではないでしょうか?または、エラーを表示するために{{form.name.errors}}を特定の場所に配置する必要がありますか? – JoJoDeath

+1

'form.non_field_errors'をインクルードしました。これは、特定のフィールドに属していないエラーです。あなたは 'clean_name'にエラーを発生させました。エラーは' name'フィールドに属し、 'form.name.errors'をインクルードする必要があります(あるいは、すべてのエラーを一番上に)。 – Alasdair

関連する問題