2016-10-03 95 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