Django - 表单元素的默认值错误

时间:2012-10-10 23:47:25

标签: django django-forms

一页[admin page]中有两个链接。两者都进入相同的表格页面[添加帖子]。在管理页面;您可以点击“新帖子”链接,也可以在连接到同一页面的文本框中输入您的标题[添加帖子]。在那页;我有一个具有复选框字段的表单。

isdraft = forms.BooleanField(required=False,initial=True)
你可以看到;我将字段的默认值设置为True。如果我点击管理页面上的“新帖子”;来那个表格页面;它很棒。复选框来到我身边。但是,如果我使用其他方式[在文本框中键入标题]复选框来找我为False。我无法理解这一点。

编辑:我认为问题很复杂。不清楚。如果需要任何额外数据;我可以添加它。

修改

admin.html:

<h1>Posts<a href="{% url add_post %}" class="button">New Post</a></h1> #this works!

    <form action="{% url add_post %}" method="POST">{% csrf_token %}
        {{ form.title }} <!-- this is textbox -->
        {{ form.isdraft.as_hidden }} <!-- when i add this line form works correctly. but i get 'please fill all fields' warning when redirected to add_post page. -->
    </form>

edit2 : add_post view:

@login_required(login_url='/login/')
def add_post(request):

    template_name = 'add.html'
    owner = request.user
    if request.method == "POST":
        form = addForm(request.POST)
        if form.is_valid():
            titleform = form.cleaned_data['title']
            bodyform = form.cleaned_data['body']
            checkform = form.cleaned_data['isdraft']

            n = Post(title=titleform, body=bodyform, isdraft=checkform, owner=owner)
            n.save()
            messages.add_message(request, messages.SUCCESS, 
                'New post created successfully!')
            return HttpResponseRedirect('/admin/post/add/')
        else:
            messages.add_message(request, messages.WARNING, 
                'Please fill in all fields!')
    else:
        form = addForm()
    return render_to_response(template_name, {'form': form, 'owner':owner,},context_instance=RequestContext(request))`

管理员视图:

@login_required(login_url='/login/')

def admin_view(request):
    if request.session.get('loggedin') == "djangoo":
        form = newDraft() # textbox in admin page
        return render_to_response('admin.html', {'form':form },context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/login/')

addForm:

class addForm(forms.Form):

    title = forms.CharField(max_length=100, 
        widget=forms.TextInput(attrs={'placeholder':'Title here',}))
    body = forms.CharField(widget=forms.Textarea(
        attrs={'placeholder':'Write post here','rows':'25','cols':'90',}))
    isdraft = forms.BooleanField(required=False,initial=True)

1 个答案:

答案 0 :(得分:1)

initial仅在表单为unbound时有效。

当您点击新帖子链接时,您正在页面上执行获取请求,因此表单未绑定且使用了initial值。

当您输入标题并提交时,我假设您正在页面上发布帖子请求。因此,表单被绑定,并且不会使用initial值。

我担心我完全不理解这个问题,而且你没有显示太多代码,所以我不能为你推荐任何工作。希望你能让它发挥作用。

更新以下对您的问题的修改

当数据来自add_post视图时,请不要创建绑定表单,因为这样数据将被验证,您将收到错误消息。

相反,从帖子数据中提取title,并使用它来创建initial字典,以便用addForm实例化。{/ p>

您需要一种方法来判断帖子请求是来自管理员还是添加帖子视图。您可以通过向addForm添加另一个隐藏字段来完成此操作。

action = forms.CharField(widget=forms.HiddenInput, initial="addform")

然后将您的add_post视图更改为:

if request.method == 'POST':
    if request.POST.get('action') == 'addform':
        form = addForm(initial={'title': request.POST.get('title'), 'isdraft': True})
    else:
        # your existing code for handling a request post