2014-03-24 84 views
2

及彼模型實例通過PK是示例代碼:在Django中如何避免樣板代碼爲視圖中

def someview(request): 
    try: 
     instance = SomeModel.objects.get(id=request.GET.get('id')) 
    except SomeModel.DoesNotExist: 
     instance = None 
    except ValueError: 
     # This error may occur if user manually enter invalid (non-integer) 
     # id value (intentionally or not) in a browser address bar, e.g. 
     # http://example.com/?id=2_foo instead of http://example.com/?id=2 
     # This raises ValueError: invalid literal for int() with base 10: '2_' 
     instance = None 
    ... 

有沒有獲得通過PK模型實例沒有在寫這個樣板代碼的最佳實踐和過度?我應該在Django中使用一些預定義的快捷方式嗎?還是僅使用我自己的?

我確信我應該使用Django的DetailView或SingleObjectMixin但奇怪的是它不會從我的例子https://github.com/django/django/blob/master/django/views/generic/detail.py#L50
處理ValueError異常是它意味着我必須指定的URL配置PK kwarg正確的整數的正則表達式?好的,可能。但是如果我從請求querystring中獲取pk呢?

UPD我有特殊的邏輯來處理實例,它是無或不是。

+0

如果對象不存在,你想要做什麼?提高404或只是做一些其他的邏輯與實例='None' –

+0

這正是基於類的視圖閃耀的地方。 – 2014-03-24 14:44:10

+0

只是爲了確保您會注意到,您可以覆蓋get_object方法。 – aisbaa

回答

3

你也可以使用Django內置的shorcut get_object_or_404(),它專門爲此設計的。如果該對象不存在,該函數將引發一個異常Http404。如果你想獲得None反而提高了例外的,你可以創建一個輔助功能,很容易完成它:

def get_object_or_none(klass, *args, **kwargs): 
    try: 
     return get_object_or_404(klass, *args, **kwargs) 
    except Http404: 
     return None 

希望這有助於!

+0

不幸的是,這在輸入不正確的情況下不會處理ValueError。 – ivanperelivskiy

+0

您可以自己處理它,然後在幫助器功能中處理它。如果您需要量身定製的行爲,並且「get_object_or_404」不適合您的需求,請將其忘掉。只需創建一個具有相同簽名(非常方便)的函數,並將所有樣板代碼分解爲它。你最終會得到一個適合你的需求的幫助函數:) –

1

你嘗試的第一部分/ except塊可以通過使用django-annoying被簡化:

from annoying.functions import get_object_or_None 

instance = get_object_or_None(SomeModel, id=request.GET.get('id')) 

僅供參考,您也可以直接從包中提取get_object_or_None(見source)。

1

有很多通用的基於類的視圖可能會有幫助,在你的情況下DetailView可以工作。

from django.views.generic.detail import DetailView 

class SomeModelDetailView(DetailView): 
    model = SomeModel 

您可以覆蓋get_object方法來更改默認行爲。

def get_object(self, queryset=None): 
    return SomeModel.objects.get(pk=self.get_pk()) 

最後,如果對象沒有,您應該可以顯示自定義404頁面。

相關問題