0

1ページ[管理ページ]には2つのリンクがあります。両方とも同じフォームページ[投稿の追加]に移動します。管理ページで; [新しい投稿]リンクをクリックするか、同じページに接続されているテキストボックスにタイトルを入力することができます[投稿の追加]。そのページで; チェックボックスフィールドがあるフォームがあります。

isdraft = forms.BooleanField(required=False,initial=True)

ご覧のように ; フィールドのデフォルト値を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ビュー:

@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)
4

1 に答える 1

1

initialフォームがバインドされていない場合にのみ機能します。

新しい投稿リンクをクリックすると、ページでgetリクエストを実行しているため、フォームはバインドされておらず、initial値が使用されます。

タイトルを入力して送信するときは、ページでPOSTリクエストを行っていると想定しています。したがって、フォームはバインドされ、initial値は使用されません。

質問を完全に理解しておらず、コードをあまり表示していないので、回避策を提案することはできません。あなたがそれを機能させることを願っています。

質問に対する次の編集を更新します

データがadd_postビューから取得される場合は、バインドされたフォームを作成しないでください。データが検証され、エラーメッセージが表示されます。

title代わりに、投稿データからをフェッチし、それを使用してinitialをインスタンス化する辞書を作成しますaddForm

投稿リクエストが管理者からのものか、投稿ビューを追加したものかを判断する方法が必要です。これを行うには、に別の非表示フィールドを追加し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
于 2012-10-10T23:58:13.057 に答える