【问题标题】:Django: Calling ModelForm via instance method - seperate fieldsDjango:通过实例方法调用 ModelForm - 单独的字段
【发布时间】:2010-10-13 15:45:06
【问题描述】:

是否可以使用类方法输出ModelForm;例如:

def edit_form(self, *args, **kwargs):
    from smf.node.forms import MediaBaseForm
    return MediaBaseForm(instance=self)

(MediaBaseForm是模型Media的ModelForm子类),然后在视图中:

form = node.edit_form()
(node contains the instance)

此代码执行时不会引发错误;但是,在查看页面时,当我尝试分别呈现每个字段时,不会生成任何表单字段。当我使用{{ formset }} 但不使用{% for form in formset.forms %}} ..etc. {% endfor %} 时,表单会显示 -->

我需要这个:

{{ formset.management_form }}
    {% for form in formset.forms %}

        {{ form.id }}
        <div id="form_title">Title: {{ form.title }}</div>
        <p>Description:</p> {{ form.description }}
        <p>Comment settings:</p> {{ form.comment }}
        <p>Promoted to frontpage:</p> {{ form.promote }}
        <p>Sticky:</p> {{ form.sticky }}
        <p>Ready for Publishing:</p> {{ form.status }}
    {% endfor %}

而不是这个:

{{ formset }}    

不能以这种方式调用表单还是我做错了什么?

完整视图:

def node_edit(request, nid):
        #Build the standard node form
        node = node_load(nid)
        obj = node_get_model(node.type, True)
        #modelFormset = modelformset_factory(obj, max_num=1)
        form = node.edit_form()

    if request.method == 'POST': # If the form has been submitted...
        #form = modelFormset(request.POST, request.FILES)
        form = node.edit_form()
        if form.is_valid():
            instances = form.save(commit=False)
            for instance in instances:
                instance.save()
            node_post_process(node, request, obj)

            if 'save_edit' in request.POST:
                id = int(nid)
                return HttpResponseRedirect('/edit/%i' %(id))
            if 'save' in request.POST:
                #id = node_callback_value.Node_ptr
                id = int(nid)
                return HttpResponseRedirect('/content/%i' %(id))
            if 'savenew' in request.POST:
                return HttpResponseRedirect('/content/add/%s' %(node.type))                
    else:
        output = {}
        #form = modelFormset(queryset=obj.objects.filter(node_ptr=nid))
        form = node.edit_form(instance=node)
    output = {
    'formset': form,
    'node': node,
    }
    try:
        return render_to_response('node/forms/%s.edit.html' %(node.type), output)
    except TemplateDoesNotExist:
        return render_to_response('node/forms/default.form.html', {
            'formset': form,
        })     

【问题讨论】:

  • 你确定你的意思是“类方法”吗?类方法将类作为第一个参数传递,而不是实例。
  • 您从视图传递到模板的上下文是什么?我怀疑你想做{{ form }} 而不是{% for form in formset.forms %},但如果没有看到你的其余部分就无法确定。
  • 抱歉信息不完整,已编辑提供。

标签: django forms


【解决方案1】:

我不明白你想做什么。不过,您的方法存在许多问题。

首先,无法将 POST 的值传递给表单实例化。因此,form.is_valid() 将始终为 False。

其次,node.edit_form() 的结果似乎是单个表单,而不是表单集。所以我不知道你为什么将它作为formset 传递给模板上下文并尝试遍历formset.forms

【讨论】:

  • 谢谢,我想出了最后一件事,但我不明白为什么它会起作用。现在我这样做了;)知道如何做到这一点吗?
猜你喜欢
  • 2013-10-06
  • 2011-11-10
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2017-07-11
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多