2017-12-21 6 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',) 
당신이 rendering the form fields manually을 경우

답변

3

, 그것은 예를 들어, 오류를 포함하는 당신까지 :

{{ 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'를 포함시켜야합니다 (또는 모든 에러를 맨 위에 넣고 싶다면'form.errors'를 반복하십시오).). – Alasdair