2017-06-16 51 views
0

擴展現有的用戶模型後,我得到一個值爲User的用戶沒有dcf_profile的RelatedObjectDoesNotExist異常。我似乎沒有爲每個用戶自動創建dcf_profile。用戶沒有dcf_profile:RelatedObjectDoesNotExist

請看看我的模型,視圖和表單,並告訴我如何更正我的視圖文件?

我的models.py:

class CustomUser(models.Model): 
    auth_user_ptr = models.OneToOneField(
           User, 
           parent_link=True, 
           related_name='dcf_profile', 
           primary_key=True 
          ) 
    phone = models.CharField(_('phone'), max_length=30, null=True, blank=True) 
    receive_news = models.BooleanField(_('receive news'), default=True, db_index=True) 
    class Meta: 
     app_label = 'dcf' 
    def allow_add_item(self): 
     if self.item_set.count() > settings.DCF_ITEM_PER_USER_LIMIT: 
      return False 
     else: 
      return True 

class Item(models.Model): 
    slug = models.SlugField(blank=True, null=True, max_length=100) 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    group = models.ForeignKey(Group, verbose_name=_('group')) 
    title = models.CharField(_('title'), max_length=100) 
    description = models.TextField(_('description')) 
    price = models.DecimalField(_('price'), max_digits=10, decimal_places=2) 
    phone = models.CharField(_('phone'), max_length=30) 
    is_active = models.BooleanField(_('display'), default=True, db_index=True) 
    updated = models.DateTimeField(_('updated'), auto_now=True, db_index=True) 
    posted = models.DateTimeField(_('posted'), auto_now_add=True) 
    def __unicode__(self): 
     return self.title 
    class Meta: 
     verbose_name = _('item') 
     verbose_name_plural = _('items') 
     ordering = ('-updated',) 
    def get_absolute_url(self): 
     return reverse('item', kwargs={ 
      'pk': self.pk, 
      'slug': self.slug 
     }) 
    def get_title(self): 
     return u'%s' % self.title 
    def get_description(self): 
     return u'%s' % self.description[:155] 
    def get_keywords(self): 
     # TODO need more optimal keywords selection 
     return ",".join(set(self.description.split())) 
    def get_related(self): 
     # TODO Need more complicated related select 
     return Item.objects.exclude(pk=self.pk)[:settings.DCF_RELATED_LIMIT] 
    def save(self, *args, **kwargs): 
     if self.slug is None: 
      self.slug = slugify(unidecode(self.title)) 
     super(Item, self).save(*args, **kwargs) 

我views.py:

class ItemCreateView(FormsetMixin, CreateView): 
is_update_view = False 
model = Item 
form_class = ItemCreateEditForm 
formset_class = inlineformset_factory(Item, Image, extra=3, fields=('file',)) 

@method_decorator(login_required) 
def dispatch(self, *args, **kwargs): 
    if not self.request.user.dcf_profile.allow_add_item(): 
     messages.error(self.request, _('You have reached the limit!')) 
     return redirect(reverse('my')) 
    return super(ItemCreateView, self).dispatch(*args, **kwargs) 
def form_valid(self, form, formset): 
    form.instance.user = self.request.user 
    form.save() 
    return super(ItemCreateView, self).form_valid(form, formset) 

我forms.py

class ItemCreateEditForm(forms.ModelForm): 
class Meta: 
    model = Item 
    fields = ('group', 'title', 'description', 'price', 'phone', 'is_active') 
+0

沒有什麼不妥*此*代碼;它是創建需要更改的用戶的代碼,以便您可以同時創建配置文件。 –

+0

您在Item模型中的用戶字段應該具有CustomUser模型的外鍵,而不是User模型。您的代碼「if self.item_set.count()> settings.DCF_ITEM_PER_USER_LIMIT:」將不起作用,否則 –

+0

@Raj Item模型中的用戶字段首先與CustomUser模型相關,但它顯示無法查詢「user」錯誤,這就是爲什麼它現在有一個外鍵用戶模型 – novis

回答

0

只是與大家分享,得到成功的解決方案,我創建了用戶模型的代理模型並更新了我的views.py:

更新models.py

class DcfUser(User): 
    class Meta: 
     proxy = True 
    def allow_add_item(self): 
     if self.item_set.count() > settings.DCF_ITEM_PER_USER_LIMIT: 
      return False 
     else: 
      return True 

更新views.py

@method_decorator(login_required) 
def dispatch(self, *args, **kwargs): 
    user = self.request.user 
    my_user = DcfUser.objects.get(username=user) 
    if not my_user.allow_add_item(): 
     messages.error(self.request, _('You have reached the limit!')) 
     return redirect(reverse('my')) 

謝謝