2012-03-12 13 views
1

以下のベストプラクティスの実装に関するガイダンスが必要です。Django:投稿データにアクセスして条件と一致させるにはどうすればいいですか

私はアプリを構築しているシナリオを持っていますが、特定の「カテゴリ」や「ロケール」と一致し、それ以外のページにリダイレクトしたい場合は通常のルートになります。ここで

私の簡単なviews.py

if form.is_valid(): 
    ... 
    kwargs = {'project_id':project_id, 'categories':request.POST['categories'], 'locale':request.POST['locale']} 
    process_se(request, **kwargs) 
    return HttpResponseRedirect(obj.next_url) 

は、ここで私は私のmodels.pyファイルに持っているものですが、非常に矛盾しているようだれます。 このリクエストを処理するより良い方法はありますか?

def process_se(self, request, **kwargs): 
    if "All" or "Sweden" in kwargs['locale']: 
     if "Technology" or "Internet" in kwargs['categories']:  
      next_url = request.build_absolute_uri(reverse('project_new_se', kwargs={'project_id': self.id})) 
    else: 
     next_url = request.build_absolute_uri(reverse('project_new_step2', kwargs={'project_id': self.id})) 
    self.next_url = next_url 

UPDATES:

私はforms.ModelFormcategorieslocalesを使用しています、私はシェルで、まだのためにシミュレートされているManyToManyFieldの はここで何の結果

を取得していないように思われcleaned_data出力されます

f.cleaned_data 
{'locale': [<Locale: Sweden>, <Locale: All>], 'categories': [<Category: Technology>, <Category: Internet>]} 

これをフィールドi n個の形式は、罰金私はもともとフォームクラスでこのコードを置く提案

答えて

3

あなたのソリューションに基づいて完全にレンダリングするように見えるが、アペルはlocalecategoriesは、モデル上の多対多のフィールドがあることを指摘する質問を改訂しました。だから今私はあなたのモデルでは、このようなメソッドを置くことをお勧め:

def requires_swedish_setup(self): 
    """ 
    Return True if this project requires extra Swedish setup. 
    """ 
    return (self.locale.filter(name__in = ('All', 'Sweden')).exists()) 
      and self.categories.filter(name__in = ('Technology', 'Internet')).exists()) 

してから、このようなあなたのビューを実装する:私はそれを想定してい

  • if form.is_valid(): 
        project = form.save() 
        next = 'project_new_step2' 
        if project.requires_swedish_setup(): 
         next = 'project_new_se' 
        next_url = reverse(next, kwargs={'project_id': project.id}) 
        return HttpResponseRedirect(next_url) 
    

    いくつかの注意LocaleおよびCategoryオブジェクトにはnameフィールドがあります(そうでない場合は、テストする名前を含むフィールドを使用します)。

  • フォームデータをrequest.POSTから読み取ることはお勧めできません(ウィジェットは実行されておらず、検証されていません)。form.cleaned_dataを使用する方がよいでしょう。

  • この場合、request.build_absolute_uriに電話する必要はありません。reverseの結果を直接HttpResponseRedirectに送るのは問題ありません。

  • "All" or "Sweden" in kwargs['locale']はおそらくあなたが意味するものではありません:それは"All" or ("Sweden" in kwargs['locale'])のように解析するので、常にtrueです。まだ途中で失敗するようで、これは私がManyToManyFieldsを使用していたという事実に起因するかもしれませんが、この詳細な説明のためにあなたをとても感謝@garteh

+0

- 私は、上記のあなたの助けをいくつかの追加の更新プログラムを追加しました非常に高く評価されています! – ApPeL

+0

ああ、私は見る:ロケールとカテゴリはオブジェクトです。だから、文字列と直接比較することはできません。文字列と*名前*を比較する必要があります。私の更新を参照してください。 –

+0

Legen - WAIT FOR IT - dary!魅力のように働き、少し編集しました。あなたはmanytomanyフィールドに.all()を持っている必要があります。それ以外の場合、エラーが発生し、プロジェクトオブジェクトをビューに渡す必要があります:) – ApPeL

関連する問題