20

jquery の .load() 関数を使用してレンダリングされた django フォームを丸呑みするダイアログを作成しようとしています。.load 関数には、「alert」オブジェクトの pk が渡されます。また、クラス関数で利用できるのはself.request.user、メッセージ モデル (models.py) で以下に示すように、これらのフィールドを事前に入力できるようにすることです。

class Message(models.Model):

    user = models.ForeignKey(User)
    alert = models.ForeignKey(Alert)
    date = models.DateTimeField()
    message = models.TextField()

django の CreateView をサブクラス化すると、ModelForm (views.py) のインスタンスを使用してコンテキストを簡単に生成できます。

class MessageDialogView(CreateView):
    """ show html form fragment """
    model = Message
    template_name = "message.html"

    def get_initial(self):
        super(MessageDialogView, self).get_initial()
        alert = Alert.objects.get(pk=self.request.POST.get("alert_id"))
        user = self.request.user
        self.initial = {"alert":alert.id, "user":user.id, "message":"test"}
        return self.initial


    def post(self, request, *args, **kwargs):
        super(MessageDialogView, self).post(request, *args, **kwargs)
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

ここでの問題はself.initial、フォームでレンダリングされないことです。フォームが実際に呼び出しget_initialており、フォーム インスタンスが に適切な初期データを持っていることを確認postしましたが、フォームがテンプレートmessage.htmlでレンダリングされると、期待どおりに初期データが取得されません。これを機能させるための特別なトリックはありますか? ドキュメント (ジェネリック ベースのクラス ビューの例が不足しているようです) とソースを精査しましたが、何が欠けているのかわかりません。

4

3 に答える 3

28

get_initial()設定に煩わされることなく、辞書を返すだけで済みますself.initial

メソッドは次のようになります。

def get_initial(self):
    # Get the initial dictionary from the superclass method
    initial = super(YourView, self).get_initial()
    # Copy the dictionary so we don't accidentally change a mutable dict
    initial = initial.copy()
    initial['user'] = self.request.user.pk
       # etc...
    return initial
于 2011-06-22T03:37:46.813 に答える
0

(あなたがしようとしていることが実際に機能するので編集されました)

昨日同じ問題に遭遇しましたが、現在は機能しています。 dict ではなくオブジェクトを返していたと思いますget_initial

あなたの問題を解決するという点で、私はあなたがどれだけやっているように見えるかについて少し疑わしいですpost().デフォルト(上書きされていない)で試していただけますpost()か?

また、使用pdb(または print ステートメント) を使用して、値が設定されself.get_form_kwargsていることを確認することもできinitialます。

于 2012-04-03T01:47:50.470 に答える