2011-12-11 69 views
1

我对Django Forms很新,而且我遇到了一个我无法解决的问题。我一直在使用Google和阅读文档,但是我找不到解释这个地方的地方。我的问题是,我有一个动物ModelModelForm如何在发生表单验证错误时指定它们?

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字段,所以数据不会保存在数据库中。这是因为我只是在表单显示的文本字段中设置日期而不是时间。

我想知道我可以做两件事情:

  1. 我怎么能再次发送错误信息的形式,这样我就可以在下添加一个文本,我也没有设置场是否正确?也就是说,像管理员那样。
  2. 我怎样才能把相同的输入类型DateTimeField,我在管理界面? (与今天和现在的功能)

回答

4

你写你的看法,显示形式的错误,在你的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窗体小部件更容易(也更简单)。

最后,在documentation表示,如果重写任何领域,你需要自己添加其他所有的验证逻辑:

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

+0

我可以调用相同的模板来显示错误吗?在表单中可以看到什么是好的,但是在错误的字段旁边显示一条消息? – amb

+0

对于'DateTime'小部件,我认为我将改变'Date'字段的模型,我并不需要小时。 – amb

+0

关于模板,您可以使用同一个(然后再次显示相同的表单)。 如果您使用日期字段,请记住默认格式为'yyyy-mm-dd',除非您更改它。 –

0

burhan的答案是现货。另外,您可能想隐藏表单上的发布者并在视图中处理它。

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

然后在您的视图:

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

否则,因为它代表我想你的形式将显示一个下拉的所有用户,你想要什么这可能不是。

相关问题