django - 我如何为现存的modelForm添加新值?

时间:2012-06-01 13:45:14

标签: django

所以我有一个模型表格 - 这是django的令人难以置信的非直观的模型编辑过程,如果有人有一个坚实的“白痴”教程,我会热衷于听到它!

手头的问题是在modelForm字段中添加/设置一个值,以便它显示在html中。

所以,我在我的视图逻辑中有这个代码:

class EditSaveModel(View):

    def get(self,request,id=None):
        form = self.getForm(request,id)
        return self.renderTheForm(form,request)

    def getForm(self,request,id):
        if id:
            return self.idHelper(request,id)
        return PostForm()

在“获取”上调用。所以,在这里,我想要展示一个预先填好的表格,或者一个新表格!

钻入idHelper:

    def idHelper(self,request,id):
        thePost = get_object_or_404(Post, pk=id)
        if thePost.story.user != request.user:
            return HttpResponseForbidden(render_to_response('errors/403.html'))
        postForm = PostForm(instance=thePost)
        postForm.fields.storyId.value = thePost.story.id **ANY NUMBER OF COMBOS HAVE BEEN TRIED!
        return postForm

我在哪里获得一个帖子对象,检查它属于活跃用户,然后附加一个新值 - “storyId”

我也试过,上面:

    postForm.storyId.value = thePost.story.id 

但是这告诉我postForm 没有要设置的storyId值!

    postForm.storyId = thePost.story.id 

但实际上并没有设置 storyId - 也就是说,在html中,没有值存在。

查看我的PostForm定义:

class PostForm(forms.ModelForm):
    storyId = forms.IntegerField(required=True, widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(PostForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Post
        ordering = ['create_date']
        fields = ('post',)

    #some validation here!
    #associates the new post with the story, and checks that the user adding the post also owns that story
    def clean(self):
        cleaned_data = super(PostForm, self).clean()
        storyId = self.cleaned_data.get('storyId')
        storyArray = Story.objects.filter(id=storyId,user=self.request.user.id)
        if not len(storyArray): #eh, this means if self.story is empty.
            raise forms.ValidationError('Whoops, something went wrong with the story you\'re using . Please try again')
        self.story = storyArray[0]
        return cleaned_data

对,这个清楚吗?夏天:

我想在我的PostForm上附加一个隐藏的 storyId字段,以便我总是知道给定帖子附加到哪个故事!现在,我知道可能有其他方法可以做到这一点 - 我可能能够以某种方式将外键添加为“隐藏”?欢迎,请告诉我如何!但我真的想把foreignKey当作一个隐藏的领域,所以随意提出一个不同的方式,也可以回答外键作为隐藏的模型问题!

使用上面的所有代码,我可以想象我可以在html中使用它(因为我的表单肯定称为“表单”):

{% for hidden in form.hidden_fields %}
    {{ hidden.errors }}
    {{ hidden }}
{% endfor %}

甚至

{{ form.storyId }}

但这不起作用! storyId永远不会显示为设定值。

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

您是否尝试将其传递给构造函数?

def __init__(self, *args, **kwargs):
    self.request = kwargs.pop('request', None)
    self.story_id = kwargs.pop('story_id', None)
    super(PostForm, self).__init__(*args, **kwargs)
    self.fields['storyId'].initial = self.story_id