簡體   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