2012-03-12 20 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 

更新:

我使用forms.ModelFormcategorieslocalesManyToManyField的 我已經模擬了在外殼和似乎仍然沒有得到結果

這裏是cleaned_data輸出

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

儘管爲字段i n根據您的解決方案,表單看起來完美無缺

回答

3

我最初建議將此代碼放在表單類中,但ApPeL修改了問題,指出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) 

一些注意事項:

  • 我假設LocaleCategory對象有name字段(如果沒有,請使用任何字段包含您正在測試的名稱)。

  • request.POST中讀取表單數據並不是一個好主意(小部件沒有機會運行,但它尚未驗證):最好使用form.cleaned_data

  • 在這種情況下,您無需致電request.build_absolute_uri:將reverse的結果直接輸入到HttpResponseRedirect即可。

  • "All" or "Sweden" in kwargs['locale']可能不是你的意思:它像"All" or ("Sweden" in kwargs['locale'])那樣解析,所以總是如此。

+0

@garteh非常感謝你爲這個詳細的說明,但它似乎仍然沿途失敗,這可能的事實是由於我使用ManyToManyFields - 我增加了一些額外的更新上面,你的幫助非常感謝! – ApPeL 2012-03-13 10:13:35

+0

啊,我看到:語言環境和類別是對象。所以你不能直接將它們與字符串進行比較,你必須將它們的*名稱與字符串進行比較。查看我的更新。 – 2012-03-13 10:25:41

+0

Legen - 等待它 - dary!像魅力一樣工作,編輯一點點,你需要在manytomany領域有.all(),否則它會引發一個錯誤,並需要在視圖中傳遞項目對象:) – ApPeL 2012-03-13 10:55:10

相關問題