2017-06-07 19 views
0

Ich habe versucht, meinen Benutzer Modell mit dem folgenden Profilmodell zu verlängern, aber ich erhalte eine Fehlermeldung Attribut‚User‘ Objekt hat kein Attribut ‚allow_add_item‘

Benutzer ‚Objekt kein Attribut hat‘ allow_add_item

Mein App-Modell hat die folgende Klasse. Bitte sagen Sie mir, welche Korrekturen benötigt werden.

class CustomUser(models.Model): 
    user = models.OneToOneField(User, related_name="dcf_profile") 
    phone = models.CharField(_('phone'), max_length=30, null=True, blank=True) 
    receive_news = models.BooleanField(_('receive news'), default=True, db_index=True) 
    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(CustomUser, 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) 

Mein views.py enthält:

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

Antwort

0

Es ist schwer, sicher zu sagen, weil der Code, den Sie geschrieben haben Einzug Fehler anderes als das hat über Sie fragen.

Ihre Nachricht zeigt jedoch an, dass Sie die Methode, die Sie anrufen möchten, nicht definiert haben. Wenn Ihre Klasse CustomUser eine Methode allow_add_item() haben soll, muss die Methodendefinition innerhalb der Klasse sein. Was ich sehe, ist eine Codezeile, die nur danach post_save.connect() und die Definition von allow_add_item() aufruft. Wenn Sie das tun, ist es kein Mitglied der Klasse, es ist nur eine Funktion mit dem irreführenden Argument self, die es wie eine Methode aussehen lässt.

Sie müssen es einrücken, um es in die Klassendefinition einzufügen. Und keinen zwingenden Code dazwischen haben.

class CustomUser(models.Model): 
    ... 
    def allow_add_item(self): 
     if self.item_set.count() > settings.DCF_ITEM_PER_USER_LIMIT: 
      return False 
     else: 
      return True 
+0

Ich habe meine Frage oben aktualisiert, könnten Sie bitte mir die Lösung sagen, weil ich immer noch die gleiche Attributemeldung. – novis

0

Unter der Annahme, dass jeder Benutzer immer einen CustomUser daran befestigt hat, was Sie ändern müssen, ist self.request.user.allow_add_item()-self.request.user.customuser.allow_add_item()

Ihre CustomUser nicht den regulären Benutzer ersetzen, um es zu einem auf sie durch den einen erweitert Beziehung.

Quelle: https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model

+0

Es zeigt RelatedObjectDoesNotExist Fehler an (\t Benutzer hat keinen customuser), es scheint, dass es mit umgekehrten Fremdschlüsselbeziehungen verwandt ist. Bitte helfen Sie mir, eine Lösung zu finden. – novis

+0

auf den OneToOneField-Parameter versuchen Sie, Reverse-Name = 'Custom_user' hinzufügen, und verwenden Sie dann request.user.custom_user –

+0

Ich habe den related_name (nicht reverse_name) aktualisiert, aber ich bekomme RelatedObjectDoesNotExist Fehler. Bitte sehen Sie die Item-Klasse oben und das Benutzerfeld und sagen Sie mir, was zu tun ist. Ich denke, dass eine Beziehung zwischen den CustomUser- und den Item-Tabellen benötigt wird – novis

Verwandte Themen