ModelChoiceField 和模板

Posted

技术标签:

【中文标题】ModelChoiceField 和模板【英文标题】:ModelChoiceField and templates 【发布时间】:2013-07-05 21:24:02 【问题描述】:

我是 Django 新手。我有这样的模型:

class Category(models.Model):
    category = models.CharField(max_length=20)

    def __unicode__(self):
        return self.category

class Tag(models.Model):
    tag = models.CharField(max_length=30, blank=True)


    def __unicode__(self):
        return self.tag

class News(models.Model):
    title = models.CharField(max_length=80)
    category = models.ForeignKey(Category)
    author = models.ForeignKey(User)
    news_body = models.CharField(max_length=5000)
    pub_date = models.DateField(default = datetime.datetime.now())
    tags = models.ManyToManyField(Tag, blank=True)

    def __unicode__(self):
        return self.title

还有表格,用于添加新闻:

class AddNewsForm(ModelForm):
    class Meta():
        model = News

我对模板中的 ModelChoiceField 表示有疑问。 我想像这样使用<select>/<option> 标签:

<select id="id_category" name="category">
<option value="" selected="selected">---------</option>
% for cat in form.category  %
<option>cat</option>
% endfor %
</select>

但它不起作用。如何获得类别字段选择(遍历它们)。这是一个简单的问题,但我很困惑,找不到有效的解决方案。

使用 form.as_p 效果很好,但我需要隐藏作者字段(作者 - 登录用户)。

【问题讨论】:

【参考方案1】:

从表单中隐藏author 的更简洁的方法是

class AddNewsForm(ModelForm):
    class Meta:
        model = News
        exclude = ('author', )

在视图中:

@login_required
def myView(request):
    #some code here
    if request.POST:
        form = AddNewsForm(request.POST)
        if form.is_valid():
            news = form.save(commit=False)
            news.author = request.user
            news.save()

     #rest of the code

并让模板加载默认方式 form.as_p

【讨论】:

以上是关于ModelChoiceField 和模板的主要内容,如果未能解决你的问题,请参考以下文章

django ModelChoiceField:如何遍历模板中的实例?

ModelForm组件和forms组件补充

django choice字段模板展示

Django,ModelChoiceField() 和初始值

有没有办法覆盖模板中的表单值?

使用 Django 使用 ModelChoiceField 和 queryset 参数