4

これは技術的な質問ではなく、「これを正しい方法で行っているか」という質問です。

いくつかのモデルが定義されています

class Style(models.Model):
    tag_xml = models.TextField()
    image = models.ImageField(upload_to="styles")
    user = models.ForeignKey(User)
    uploaded = models.DateField()

class StyleMatch(models.Model):
    style = models.ForeignKey(Style)
    item = models.ForeignKey(FashionItem)

タスクの性質上、html フォームを介してデータを入力することはできません。そのため、それらを入力するために、jquery と多くのイベント関数およびその他の JavaScript グッズを含む html ページを用意しています。保存ボタンをクリックすると、.ajax() が呼び出され、収集されたすべての変数が渡されます。

var saveRequest= $.ajax({
url: "/save_style/",  
type: "POST",        
data: "selection="+s+"&user="+user+"&src="+image_src,
dataType: "text"    
});

私の save_style ビューは、値をモデルに保存します

def save_style(request):
if request.method == 'POST':
    selection = request.POST['selection'].rsplit("|")
    user = request.POST['user']
    src = request.POST['src']

    f = open(MEDIA_ROOT+src)
    image_file = File(f)

    u = User.objects.get(id=user)

    style = Style(tag_xml = "",
                  image = image_file,
                  user = u,
                  uploaded = date.today())
    style.save()

    for s in selection:
        if (s != ''):
            match = FashionItem.objects.get(id=s)
            styleMatch = StyleMatch(style = style,
                                    item = match)
            styleMatch.save()

    i = StyleMatch.objects.filter(style=style)
    items = FashionItem.objects.filter(id__in=i)

   return render_to_response('style_saved.html', dict(image=src, items=items, media_url = MEDIA_URL), context_instance=RequestContext(request))

これを行った後、成功ページに移動して、モデルに追加したばかりのレコードを表示したいのですがrender_to_response、モデルの詳細を使用して返す場合は、ページ全体を JavaScript で再構築する必要があります。新しいテンプレートですがHttpResponseRedirect、a) 値を返すことができず、b) 正しくリダイレ​​クトされていないようです (投稿が私の JavaScript から発信されているためだと思います)。

最後に私の質問

  1. これは本当に私がこれを行うべきですか?django doc は、これらのやや複雑な領域を実際にはカバーしていないように見えるので、少し確信が持てません。
  2. 上記の render_to_response または HttpResponseRedirect を使用する必要がありますか? または、おそらく私が知らない3番目のオプションです。

任意の提案をいただければ幸いです。

参考までに、上記のコードは理想的ではないことを知っています。つまり、検証やコメントの欠落などです。単にデモンストレーション目的で提供されています。ただし、深刻な問題がある場合は遠慮なく指摘してください。

4

2 に答える 2

1

アプリケーションの性質にもよりますが、ページ全体を JavaScript で構築するべきではありません。ただし、すでにそこにいるので、次のソリューションを使用して素晴らしい結果を得ました。

テンプレート「フラグメント」を作成することを検討してください。これは、AJAX 経由で転送されるデータのカプセルとして設計された単なる HTML です。このフラグメントに対して render_to_response を実行し、処理されたビュー データを変数として渡し、AJAX を介してこのデータを取得し、JavaScript を使用して、指定された div 要素内の HTML を返されたデータに置き換えます。

上記のソリューションには、スタイル設定やテンプレート フラグメントへのイベント ハンドラーのアタッチなど、いくつかの落とし穴がありますが、少なくとも機能するはずです。この点に関するヒントとして、jQuery の .on() に慣れてください。

于 2012-05-21T12:23:19.060 に答える
0

収集されたすべての変数を渡す

なぜしないの$(form).serialize()ですか?

値をモデルに保存します

なぜdjango.forms.ModelForm(またはそれらのいくつかを)使用しないのですか?

正しくリダイレ​​クトされていないようです

AJAX のリダイレクトは AJAX 呼び出しで処理され、受信したデータを JS で何らかの方法で処理しない限り、開いているページには影響しないためです。

また、データの検証やエラー報告もありません。これは悪いことです。実際、それにModelFormは大きな助けになるはずです。

于 2012-05-21T05:28:58.100 に答える