繁体   English   中英

如何在表单验证错误发生时指定它们?

[英]How can I specify form validation errors when they occur?

我对Django Forms很新,而且我遇到了一个我无法解决的问题。 我一直在谷歌搜索和阅读文档,但我找不到这个解释的地方。 我的问题是我有一个动物 Model和一个ModelForm

class Animal(models.Model):
    name = models.CharField(max_length=300)
    age = models.PositiveSmallIntegerField()
    race = models.ForeignKey(Race)
    description = models.TextField()
    state = models.ForeignKey(State)
    pub_date = models.DateTimeField(auto_now_add=True)
    adoption_limit = models.DateTimeField(blank=True, null=True)
    location = models.ForeignKey(Location)
    publisher = models.ForeignKey(User)
    def __unicode__(self):
        return self.name

class AnimalForm(ModelForm):
    class Meta:
        model = Animal

我通过urls.py呈现此信息,调用此视图:

@login_required
def new_animal(request):
    if request.method == "POST":
        form = AnimalForm(request.POST)
        if form.is_valid():
            form.save()
            return render_to_response('/')
        else:
            variables = RequestContext(request, {'e': form.errors})
            return render_to_response('web/error.html', variables)
    else:
        form = AnimalForm()
    variables = RequestContext(request, {'form': form})
    return render_to_response('web/animal_form.html', variables)

似乎我在引入adoption_limit字段时出错,因此数据不会保存在DB中。 这是因为我只是在表单显示的文本字段中设置了日期而不是时间。

我想知道如何做两件事:

  1. 如何将错误消息再次发送到表单,以便我可以在我未正确设置的字段旁边添加文本? 就像管理员一样。
  2. 如何为管理界面中的DateTimeField相同的输入类型? (使用Today和Now功能)

您在web/error.html模板中编写视图,显示表单错误的方式,只需输出错误:

{%if e %}
  You had some errors in your submission!<br />
  {{ e }}
{% endif %}

但是,您没有显式传递错误列表,它是表单本身的一部分。 一点简化:

variables = RequestContext(request, {'form': form})
return render_to_response('web/error.html', variables)

然后,在您的模板中:

{% if form.errors %}
   You have some errors!<br />
   {{ form.errors }}
{% endif %}

对于问题的第二部分 - 显示django日期时间窗口小部件 - 事情变得更加复杂:

# First, you need to import the widget:
from django.contrib.admin.widgets import AdminSplitDateTime
from django.forms import TextField

# In your form class, you have to specify the widget
# for the field.

class AnimalForm(forms.ModelForm):
   pub_date = models.TextField(widget=AdminSplitDateTime)
   class Meta:
      model = Animal

为了使其工作,您必须确保您的管理媒体目录可以从您的项目访问(因为所有的javascript和css都包含在那里)。 您还要确保还添加了所有样式表。 从首选库中使用您自己的javascript表单小部件会更容易(也更简单)。

最后,如文档中所述,如果覆盖任何字段,则需要自己添加所有其他验证逻辑:

如果你明确地实例化这样的表单字段,Django假定你想要完全定义它的行为; 因此,不会从相应的模型中绘制默认属性(例如max_length或required)。 如果要维护模型中指定的行为,则必须在声明表单字段时明确设置相关参数。

burhan的回答很明显。 另外,您可能希望隐藏表单上的发布者并在您的视图中处理它。

为此,请将exclude =('publisher',)添加到ModelForm中的类Meta。

然后在你看来:

if form.is_valid():
    animal = form.save(commit=false)
    animal.publisher = request.user
    animal.save()

否则,就目前而言,我认为您的表单会在下拉列表中显示所有用户,这可能不是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM