2016-10-03 144 views
1

我在使用get_or_create()在我的視圖中遇到問題。 我想要做的是讓用戶每當想要添加關鍵字時獲取或創建關鍵字模型的實例。Django - get_or_create()的問題

我有一個關鍵詞模型,看起來像這樣:

class Keyword(models.Model): 
    word = models.CharField(max_length=30, unique=True, default=None) 
    members = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, default=None) 

    def __str__(self): 
     return self.keywords 

我有一個表格來創建關鍵字:

class KeywordForm(forms.ModelForm): 
    keywords = forms.CharField(max_length=30) 

    def __init__(self, *args, **kwargs): 
     super(KeywordForm, self).__init__(*args, **kwargs) 
     self.fields["keywords"].unique = False 

    class Meta: 
     fields = ("keywords",) 
     model = models.Keyword 

我在視圖中嘗試不同的東西,這是我的當前版本,不使用get_or_create。它不僅創造了關鍵字:

class KeywordCreationView(LoginRequiredMixin, generic.CreateView): 
    form_class = forms.KeywordForm 
    model = models.Keyword 
    page_title = 'Add a new keyword' 
    success_url = reverse_lazy("home") 
    template_name = "accounts/add_keyword.html" 

    def form_valid(self, form): 
     var = super(KeywordCreationView, self).form_valid(form) 

     self.object.user = self.request.user 
     self.object.save() 
     self.object.members.add(self.object.user) 

     return var 

應該怎樣我的觀點看,爲了得到關鍵字,如果它存在,如果這樣做,將用戶添加爲「成員」。如果沒有,請創建關鍵字。

感謝您的幫助!

回答

0

我確實相信CreateView不適合這個。您應該使用UpdateView替代並覆蓋此基於類的視圖的get_object方法(實際上是SingleObjectMixin的一部分)祖先。

該混入的source code是相當daunging但作爲

def get_object(self, queryset=None): 
    pk = self.kwargs.get(self.pk_url_kwarg) 
    if queryset: 
     obj, c = queryset.get_or_create(pk=pk) 

    else: 
     obj, c = MyModel.get_or_create(pk=pk) 

    return obj 

簡單的情況下,一些可能會奏效。但坦率地說,使用簡單的(非基於類的視圖)非常簡單

+0

嗨,對不起,我花了這麼長的時間來回答。我沒有設法使它與你的答案一起工作。但是你的確引導了我朝着正確的方向前進:我最終放棄了基於類的視圖,並進行了簡單的(未分類的視圖)。它的工作原理 - 說實話太容易了。謝謝! –

+0

是的,我也不是基於課堂觀點的粉絲。 – e4c5