对 Django 来说相对较新,并试图将处理 M2M 关系的标准实践拼凑到一个表单中。我已经有了模型和数据库。
对于这个例子,我在我的项目中为文章编写了一个应用程序,并且我正在尝试添加类别。为简单起见,文章具有标题、正文、时间戳(不包含在表单中)和类别。我更喜欢复选框来表示一篇文章可以属于的一个或多个类别。
到目前为止,我有:
模型.py
class Category(models.Model):
category = models.CharField(max_length=100)
def __unicode__(self):
return self.category
class Article(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
category = models.ManyToManyField(Category)
def __unicode__(self):
return self.title
视图.py
def article_index(request):
return render_to_response('article_index.html', {'articles': Article.objects.all()})
def article_detail(request, article_id=1):
return render_to_response('article_detail.html', {'article': Article.objects.get(id=article_id)} )
def article_create(request):
if request.method == 'POST': # If the form has been submitted...
form = ArticleForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
article = Article.objects.create(
title=form.cleaned_data['title'],
body=form.cleaned_data['body'],
category=form.cleaned_data['category']
)
return redirect('article_index') # Redirect after POST
else:
form = ArticleForm() # An unbound form
return render(request, 'article_form.html', { 'form': form })
表格.py
class ArticleForm(forms.Form):
title = forms.CharField(required=True)
body = forms.CharField(required=True, widget=forms.Textarea)
category = forms.MultipleChoiceField(Category.objects.all(), widget=forms.CheckboxSelectMultiple)
我目前坚持的两个项目是:
1)在视图“article_create”中,我不确定如何将类别创建为文章对象的一部分。在 shell 中,我必须通过调用 save() 创建文章,然后添加每个类别。我是否需要在这里做类似的事情,例如创建文章然后遍历每个类别?示例代码表示赞赏。
2) 尚未编写“article_edit”代码,假设它与创建非常相似,但我不确定是否需要或如何处理将先前选择的类别与当前提交进行比较的逻辑。或者,我应该删除正在编辑的文章的所有类别条目,然后根据当前提交的内容重新输入它们吗?这可能是最简单的。同样,这方面的示例代码会有所帮助。
谢谢!