一页[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)
答案 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