【问题标题】:Django how to change forms or views.py?Django 如何更改表单或views.py?
【发布时间】:2015-06-27 18:40:32
【问题描述】:

我创建了一个简单的页面,我可以在其中添加文章(标题、文本和类别)。当我在“网站管理一切正常”上执行此操作时,但当我将其添加到页面时,我无法选择类别。

http://i.stack.imgur.com/4Nxzb.jpg

我选择了类别,例如在这个屏幕上,但我的文章在我保存后没有这个类别(文章未分类)。

我创建了 forms.py 文件,我是这样完成的:

class PostForm(forms.ModelForm):

class Meta:
    model = Post
    fields = ('title', 'text', 'categories')

我必须如何更改此处的“类别”以使其可用?

models.py:

from django.db import models
from django.utils import timezone

class Category(models.Model):
    name = models.CharField('Nazwa Kategorii', max_length=100)
    slug = models.SlugField('Odnośnik', max_length=100)
    icon = models.ImageField('Ikonka Kategorii', upload_to='icons',
                              blank=True)

    class Meta:
        verbose_name = "Kategoria"
        verbose_name_plural = "Kategorie"

    def __unicode__(self):
        return self.name

class Post(models.Model):
    author = models.CharField(max_length=25, blank=True, null=True)
    title = models.CharField(max_length=200)
    slug = models.SlugField('Odnośnik', max_length=255)
    text = models.TextField()
    published_date = models.DateTimeField(
            default=timezone.now)
    categories = models.ManyToManyField(Category, verbose_name='Kategorie')

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __unicode__(self):
        return self.title

从views.py我的观点

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('blog.views.post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

【问题讨论】:

  • 看看这个SO answer。如果指定commit=False,则需要控制多对多关系。

标签: python django forms


【解决方案1】:

当您使用commit=False 保存表单时,您应该调用表单的save_m2m() 方法:

post = form.save(commit=False)
post.author = request.user
post.save()
form.save_m2m()

另一个更优雅的解决方案是将带有预设字段的instance 传递给表单的构造函数。这种情况你不需要使用commit=False 参数:

form = PostForm(request.POST, instance=Post(author=request.user))
if form.is_valid():
    post = form.save()
    return redirect('blog.views.post_detail', pk=post.pk)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2021-09-28
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多