从检索到的记录中填充Django模板

时间:2012-07-06 17:19:30

标签: python django google-app-engine

我熟悉使用模板来收集数据,但在显示时,Django会以智能方式显示字段并使用正确的值填充它们。我当然可以手动完成,但模型知道字段类型。我没有看到任何关于此的文档。例如,我从模板收集数据:

   <strong>Company Name</strong>
   <font color="red">{{ form.companyname.errors }}</font>
   {{ form.companyname }}

其中form是包含所有字段的公司模型。我将如何确保我可以使用这种类型的方法,以便Django渲染文本字段并填充当前值。例如,有一种方法可以通过以下方式发送值:

    myid = int(self.request.get('id'))
    myrecord = Company.get_by_id(myid)
    category_list = CompanyCategory.all()
    path = os.path.join(os.path.dirname(__file__), 'editcompany.html')
    self.response.out.write(template.render(path, {'form': myrecord, 'category_list': category_list}))

我可以对记录执行相同操作吗?模板是否会填充发送的值?感谢

2 个答案:

答案 0 :(得分:3)

听起来您可能会对FormModelForm的差异和正确用法感到困惑

无论您使用哪种类型的表单,表单的模板方面都保持不变: 注意:表单中的所有值(只要绑定到POST或具有实例)都将在渲染时预先填充。

<form class="well" action="{% url member-profile %}" method="POST" enctype="multipart/form-data">{% csrf_token %}
    <fieldset>
        {{ form.non_field_errors }}

        {{ form.display_name.label_tag }}
        <span class="help-block">{{ form.display_name.help_text }}</span>
        {{ form.display_name }}
        <span class="error">{{ form.display_name.errors }}</span>

        {{ form.biography.label_tag }}
        <span class="help-block">{{ form.biography.help_text }}</span>
        {{ form.biography }}
        <span class="error">{{ form.biography.errors }}</span>

        <input type="submit" class="button primary" value="Save" />
    </fieldset>
</form>

如果您想从记录中填充表单(或将表单作为记录提交),最好使用ModelForm

EX不显示用户FK下拉列表的个人资料表单:

class ProfileForm(forms.ModelForm):
    """Profile form"""      
    class Meta:
        model = Profile
        exclude = ('user',)

观点:

def profile(request):
    """Manage Account"""
    if request.user.is_anonymous() :
        # user isn't logged in
        messages.info(request, _(u'You are not logged in!'))
        return redirect('member-login')

    # get the currently logged in user's profile
    profile = request.user.profile

    # check to see if this request is a post
    if request.method == "POST":
        # Bind the post to the form w/ profile as initial
        form = ProfileForm(request.POST, instance=profile)
        if form.is_valid() :
            # if the form is valid
            form.save()
            messages.success(request, _(u'Success! You have updated your profile.'))
        else :
            # if the form is invalid
            messages.error(request, _(u'Error! Correct all errors in the form below and resubmit.'))
    else:
        # set the initial form values to the current user's profile's values
        form = ProfileForm(instance=profile)

    return render(
        request, 
        'membership/manage/profile.html', 
        {
            'form': form, 
        }
    )

注意外部else使用实例form = ProfileForm(instance=profile)初始化表单,并且表单提交使用post初始化表单,但仍然绑定到实例form = ProfileForm(request.POST, instance=profile)

答案 1 :(得分:0)

如果您正在查看表单,那么从Django的forms framework开始,特别是forms for models,似乎是一个好主意。