Saturday, June 17, 2017

Re: User has no dcf_profile : RelatedObjectDoesNotExist

Just to share with you the solution that worked, I have created a proxy model of the User model and used the code that abraham provided me :

Updated 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  

Updated 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'))  

Thank you


On Friday, June 16, 2017 at 1:06:33 PM UTC+2, Nabil BOUDERBALA wrote:

After extending an existing user model, I get RelatedObjectDoesNotExist exception with a value User has no dcf_profile. I seems that dcf_profile isn't created automatically for each user.

Please take a look at my model, view and form below and tell me how can I correct my views file?

My 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)

My 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)

My forms.py

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

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/ebe7c8ad-0998-438a-b9c7-c633919f3f1d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment