【问题标题】:django 1.11 raise forms.validationError not showing the error in htmldjango 1.11 raise forms.validationError 未在 html 中显示错误
【发布时间】:2018-06-04 06:32:03
【问题描述】:

我已尝试寻找有关如何检查表单名称是否已存在于数据库中的解决方案。我使用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',)

【问题讨论】:

    标签: python html django django-forms validationerror


    【解决方案1】:

    如果您是rendering the form fields manually,则由您决定是否包含错误,例如:

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

    【讨论】:

    • 不是用“if form.non_form_errors”部分处理的吗?还是我必须将 {{form.name.errors}} 放在特定的地方以显示错误?
    • 您已包含form.non_field_errors,这是不属于任何特定字段的错误。您在clean_name 中提出了一个错误,因此该错误属于name 字段,您必须包含form.name.errors(或者如果您希望所有错误都位于顶部,则可能循环通过form.errors)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2015-07-31
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多