2

ミニブログへのユーザーの投稿に基づいて、ミニ返信システムを構築しようとしています。すべての投稿には、replyという名前のリンクがあります。返信を押すと、返信フォームが表示され、返信を編集してフォームを送信します。問題は、返信したい投稿のIDを取得する方法がわからないことです。ビューでは、パラメーターとして1つの番号(ブログ投稿のIDとして)を使用すると、データベースへの応答が挿入されます。しかし、ハードコーディングしないことでどうすればそれを行うことができますか?

ビューは次のとおりです。

def save_reply(request):

  if request.method == 'POST':
    form = ReplyForm(request.POST)
    if form.is_valid():
       new_obj = form.save(commit=False)
       new_obj.creator = request.user
       new_post = New(1) #it works only hardcoded
       new_obj.reply_to = new_post
       new_obj.save()
       return HttpResponseRedirect('.')    
  else:
       form = ReplyForm()     
  return render_to_response('replies/replies.html', {
       'form': form,
       }, 
      context_instance=RequestContext(request))  

私はforms.pyにあります:

  class ReplyForm(ModelForm):
    class Meta:
      model = Reply
      fields = ['reply']

およびモデルの場合:

class Reply(models.Model):
reply_to = models.ForeignKey(New)
creator = models.ForeignKey(User)
reply = models.CharField(max_length=140,blank=False)
    objects = NewManager()   

Newはマイクロブログクラスであると述べています

    thanks
4

3 に答える 3

3

やあ。私はあなたのアドバイスを使って問題を解決しましたが、私は別のものを作成しました。返信フォームは別のページにあるので、返信ボタンを押した後、ブログページがなくなったので、その返信リンクをクリックするだけでは、とにかく投稿IDを保持するのに役立たないと思っていました。したがって、私の見解では、ブログ投稿のIDをパラメーターとして保持する関数を作成しました。問題なく保存できますが、今の私の問題は次のとおりです。

    url(r'^save_reply/(?P<id>\d+)/$', 
                       save_reply,
                       name='save_reply'), 

(これは私が私のurls.pyに保持しているものです)各投稿の下の返信に?つまり、これまでの返信リンクは単に関数replies / save_reply(私はReplyを持っていました)を呼び出していましたが、今、パラメーターとしてIDを持っている場合、それをhref ='what here'に入れるにはどうすればよいですか?

これが私のviews.pyで正しく機能します:

 def save_reply(request, id):

 if request.method == 'POST':
    form = ReplyForm(request.POST)
    if form.is_valid():
       new_obj = form.save(commit=False)
       new_obj.creator = request.user

       u = New.objects.get(pk=id)
       new_obj.reply_to = u   

       new_obj.save()
       return HttpResponseRedirect('.')    
 else:
       form = ReplyForm()     
 return render_to_response('replies/replies.html', {
       'form': form,
       }, 
      context_instance=RequestContext(request))  

ブラウザに入力して呼び出します:http: //127.0.0.1 :8000 / replys / save_reply / 1 /(たとえば)もちろん、外部キーフィールドを削除しました。これは不要なためです。

ありがとうございました!

于 2010-05-28T20:36:01.530 に答える
1

コメントが関連するNewのインスタンスのPKをキャプチャするには、フォームに非表示のフィールドが必要です。

ModelFormを使用しているため、ReplyモデルにはすでにForiegnKey関係が確立されています。ウィジェットタイプを非表示に設定して、ユーザーに表示されないようにすることができます。

# forms.py
class ReplyForm(ModelForm):
    class Meta:
        model = Reply
        fields = ['reply', 'reply_to']
        widgets = {
            'reply_to': forms.HiddenInput),
        }

ReplyFormを初期化するとき、次のようにreply_toフィールドに入力できますform = ReplyForm({'reply_to': new.pk})。ここnewで、はNewのインスタンスです。

Newところで、モデルの名前をのようなものに変更することを検討するかもしれませんPost。「新規」について話すのは少し難しいですが、「新規」は通常、プログラミングのコンテキストではまったく異なることを意味するため、少し混乱します。

于 2010-05-27T21:28:16.743 に答える
1

返信を押すと、返信フォームが表示されます。

これはあなたが取り組む必要のある部分だと思います。返信フォームをレンダリングするときは、返信される投稿のID(Newのインスタンス)が必要です。あなたがそれを追跡する他の方法がない限り、これはおそらくリクエストを介して来なければなりませんか?

次のようなもの:

def save_reply(request):
    ...
    else:
        form = ReplyForm()
        form.reply_to = New.objects.get(id=request.REQUEST["post_id"])

したがって、フォームをレンダリングするリンクに「post_id」パラメータが含まれていることを確認する必要があります(または同様の-おそらく、問題の投稿を表示するために使用される同等のものがすでにありますか?)。

と一緒に

widgets = {
        'reply_to': forms.HiddenInput),
}

これをコーディングすると、必要に応じてフォームがレンダリングされます。

投稿IDはチェーン全体に渡される必要があります

--post_id->投稿のレンダリング--post_id->返信フォームのレンダリング--post_id->返信の保存

于 2010-05-28T16:06:41.837 に答える