2017-12-21 3 views
0

Ich habe versucht, nach Lösungen zu suchen, wie man überprüft, ob der Name eines Formulars bereits in der Datenbank existiert. Ich habe this link verwendet, um herauszufinden, wie, und es ist in der Tat nicht erlaubt, doppelte Namen eingegeben werden. Aber wo ich einen erwartet habe, habe ich keine Fehlermeldung erhalten. Ich bin mir nicht sicher, was ich hier falsch mache, also wenn mir jemand sagen könnte, was ich tun soll, wäre das wirklich nützlich!django 1.11 raisen forms.validationError zeigt den Fehler in html nicht an

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.') 

nicht sicher, wenn nötig, so werde ich poste models.py auch:

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',) 

Antwort

3

Wenn Sie rendering the form fields manually sind, dann ist es an Ihnen, die Fehler enthalten, zum Beispiel:

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

nicht, dass mit dem „if form.non_form_errors“ Teil behandelt? Oder muss ich die {{form.name.errors}} an einer bestimmten Stelle platzieren, um den Fehler anzuzeigen? – JoJoDeath

+1

Sie haben 'form.non_field_errors' eingefügt, bei denen es sich um Fehler handelt, die keinem bestimmten Feld zugeordnet sind. Sie haben einen Fehler in 'clean_name' erzeugt, also gehört der Fehler zum' name'-Feld und Sie müssen 'form.name.errors' einschließen (oder vielleicht'form.errors' durchlaufen, wenn Sie alle Fehler oben haben wollen). – Alasdair