django 1.11 raise forms.validationError未在html中显示错误

时间:2017-12-21 14:46:04

标签: python html django django-forms validationerror

我已经尝试寻找有关如何检查数据库中是否已存在表单名称的解决方案。我使用this link来确定如何,并且确实不允许输入重复的名称。但在我预期的地方,我没有收到错误消息。我不确定我在这里做错了什么,所以如果有人能告诉我应该做什么,那将非常有用!

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

1 个答案:

答案 0 :(得分:3)

如果您是mini_lambda,那么您可以自行添加错误,例如:

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