0

我强烈怀疑这归结为我需要更好地理解一些语言结构,但我不知道从哪里开始,所以我只需要扔掉一些代码。

楷模:

class BlogTag(models.Model):
    tag = models.CharField(max_length=255)

    def __unicode__(self):
        return self.tag

class BlogEntry(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    date = models.DateTimeField()
    tags = models.ManyToManyField(BlogTag)

    def __unicode__(self):
        return self.title

形式:

class BlogForm(ModelForm):
    class Meta:
        model = BlogEntry

看法:

title='New Blog Entry'
if request.method=='POST':
    form=BlogForm(request.POST)
    if form.is_valid():
        cd=form.cleaned_data
        blogEntry=BlogEntry(**cd)
        blogEntry.save()
else:
    form=BlogForm();
return render_to_response('blog_add.html', locals())

通过使用**cd,我能够将清理后的数据直接放入我的对象中,这显然是可取的,因为这样视图与其他对象松散耦合——我可以更改模型,而其他一切都随着它而改变,而无需我不得不做一件事。

不幸的是,我收到一个错误:

'tags' is an invalid keyword argument for this function

我总是可以分解 CD 并构建 blogEntry=BlogEntry(title=cd['title']...) 的手动字典方法,然后一个一个添加标签,但是...我应该有更好的选择除此之外,我只是不知道它们是什么:(

4

2 回答 2

1

我认为归结为**cd将参数作为字典传递。BlogEntry期待一个BlogTag类型,tags而不是您将字典参数传递给它,该参数不是正确的类型。首先创建一个BlogTag对象,然后将其传递给BlogEntry

这可能会有所帮助http://anubis.blasux.ru/books/Python/www.djangoproject.com/documentation/0.96/models/many_to_many/

于 2012-04-19T00:21:18.450 回答
1

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

if request.method == 'POST':
    form = BlogForm(request.POST)

    if form.is_valid():
        blogEntry = form.save()
        # redirect ..

else:
    form = BlogForm()

context = {
    "form": form,
    # ...
}
return render_to_response('blog_add.html', context)

PS,locals()是不好的形式和http://www.python.org/dev/peps/pep-0008/

于 2012-04-19T00:49:08.067 回答