Django inlineformsets和一般的noobishness

时间:2011-09-20 13:20:24

标签: python django inline-formset

我很遗憾在一天内就类似主题提出两个问题,但我对django的无聊已经完全接管了。基本上我有两个模型:

class Story(models.Model):
    title = models.CharField(max_length=1000)
    text = models.CharField(max_length=5000)
    date = models.DateField(default=datetime.date.today, editable=False)
    likes = models.IntegerField(default='0')
    dislikes = models.IntegerField(default='0')
    views = models.IntegerField(default='0')
    author = models.ForeignKey('Author', related_name="username")

    class Author(models.Model):
username = models.CharField(max_length=120, unique=True)
email = models.EmailField(blank=True)
firstname = models.CharField(max_length=500, blank=True)
lastname = models.CharField(max_length=500, blank=True)

你可以想到有人提交一个故事,他们的名字会进入作者的表格。非常简单的东西。我的问题是创建一个表单,允许用户提交他们的故事和他们的名字。我已经尝试了一个inlineformset并没有运气我只是找不到一种方法来执行我所知道的只是幕后的一个简单的AND sql语句。

以下是我的表单模型: StoryAuthorFormSet = inlineformset_factory(作者,故事)

class StoryForm(ModelForm):
        class Meta:
            model = Story
            exclude = ('date', 'views', 'likes', 'dislikes', 'author')

这是我的观点

def submit_story(request):
if request.method == 'POST':
    form = StoryForm(request.POST)
    if form.is_valid:
        #watch this nest part be aware of the author bit
        author = form.save(commit=False)
        story = StoryAuthorFormSet(request.POST, instance=author)
        if author_formset.is_valid():
            story.save()
            author_formset.save()
            return HttpResponseRedirect('/thanks/')
else:
    form = StoryForm()
    author_formset = StoryAuthorFormSet(instance=Author())
    return render_to_response('submit/submit_story.html', locals(), context_instance=RequestContext(request))

我意识到他们可能是一个我错过的简单解决方案......但我很难过任何想法都会非常感激.....所以我会做一些免费的Clojure和Erlang编程任何需要它的人!

1 个答案:

答案 0 :(得分:1)

您的示例中不需要内联formset。只有当我需要为给定作者提交几个故事时,我才会使用它。

还有一些事情我会改变你的模型。

title = models.CharField(max_length=1000)
text = models.CharField(max_length=5000)

TextField可能更合适,至少对于文本部分而言。

我会像这样解决它: 创建一个AuthorForm并在同一视图中同时使用它和现有的StoryForm

所以,逻辑如下:

author_form = AuthorForm(request.POST)
if author_form.is_valid():
    author = author_form.save()
    story_form = StoryForm(request.POST)
    if story_form.is_valid():
        story = story_form.save(commit=False)
        story.author = author
        story.save()

让我们使用instance参数指定表单的现有模型。例如,您想要更新现有的数据库条目。