Friday, December 5, 2014

Re: ManyToManyField with rating using 'through' on each ManyToMany relation in Django

Did it in this fashion:

models.py

class Interests(models.Model):

ORDER = [(y, y) for y in range(10, 200, 10)] interest = models.CharField( verbose_name='Interesse', max_length=40) interest_order = models.SmallIntegerField(default=None, choices=ORDER) interest_active = models.BooleanField(default=False)

 class Meta:      verbose_name_plural = 'Interessen'      ordering = ['interest']     def __str__(self):      return self.interest  

class Sports(models.Model): ORDER = [(y, y) for y in range(10, 200, 10)] sport = models.CharField(verbose_name='Sportart', max_length=40) sport_order = models.SmallIntegerField(default=None, choices=ORDER) sport_active = models.BooleanField(default=False)

class Meta:      verbose_name_plural = 'Sportarten'      ordering = ['sport']    def __str__(self):      return self.sport  

class CustomUserprofileInterests(models.Model): user = models.OneToOneField(User) interests = models.ManyToManyField( Interests, through='CustomInterests', through_fields=('custominterest', 'interest'), verbose_name='Interessen', null=True, blank=True)

sports = models.ManyToManyField( Sports, through='CustomSports', verbose_name='Sportarten', null=True, blank=True)

class Meta: verbose_name_plural = 'Interessensprofil'

def get_full_name(self):      return self.user    def get_short_name(self):      return self.user    def __str__(self):      return '{0} | {1}'.format(self.user, 'Interessensprofil')  

class CustomInterests(models.Model):

WEIGHT = [(y, y) for y in range(1, 7)]    interest = models.ForeignKey(Interests)  custominterest = models.ForeignKey(CustomUserprofileInterests)  # interested = models.BooleanField(default=False)  rating = models.SmallIntegerField(choices=WEIGHT)  

class CustomSports(models.Model):

WEIGHT = [(y, y) for y in range(0, 7)]    sport = models.ForeignKey(Sports)  custominterest = models.ForeignKey(CustomUserprofileInterests)  # interested = models.BooleanField(default=False)  rating = models.SmallIntegerField(choices=WEIGHT)  

AND THE admin.py

class CustomProfile(admin.StackedInline): model = models.CustomUserprofile can_delete = False verbose_name_plural = 'Nutzerprofile'

class CustomUserAdmin(UserAdmin): inlines = (CustomProfile,)

class CustomInterestsInline(admin.TabularInline): model = models.CustomInterests extra = 9

class CustomSportsInlilne(admin.TabularInline): model = models.CustomSports extra = 9

admin.site.register(models.Interests) admin.site.register(models.Sports) admin.site.register(models.CustomUserprofileInterests) admin.site.register(models.CustomInterests) admin.site.register(models.CustomSports) admin.site.register(models.CustomUserprofileInterests, CustomUserprofileAdmin)


The nexts steps I want to accomplish:

A form for users, they can create/edit the profile. The 'interests' and 'sports' columns have to be prepopulated with all available (declared by 'active' with a Boolean) entries in the interests/sports table. If a user has an 'interest' or 'sports', he/she selects it (checkbox) and rates the entry.

Also the amount of entries to be selected by the user is limited to a defined amount (i.e. 6 or 10) (here would be form validation best practice?)



Am Freitag, 5. Dezember 2014 15:00:01 UTC+1 schrieb Collin Anderson:
Hi,

Create an admin Inline like this:

class CustomInterestsInline(admin.TabularInline):
    model
= CustomInterests

class CustomUserprofileInterests(admin.ModelsAdmin):
    inlines
= [CustomInterestsInline]

Collin


On Thursday, December 4, 2014 5:58:31 AM UTC-5, inoyon artlover KLANGRAUSCH wrote:

I am very beginner in the programming world, so please forgive my lack of understanding...

There is a CustomUserprofile in my models.py.. nothin very special about this...
class Interests(models.Model):        RATING = [(y, y) for y in range(1, 7)]        interest = models.CharField(max_length=40)      interest_rating = models.SmallIntegerField(choices=WEIGHT)      class CustomUserprofileInterests(models.Model):        user = models.OneToOneField(User)      interests = models.ManyToManyField(              Interests, through='CustomInterests',              through_fields=('custominterest', 'interest'),              null=True, blank=True)      class CustomInterests(models.Model):        WEIGHT = [(y, y) for y in range(1, 7)]        interest = models.ForeignKey(Interests)      custominterest = models.ForeignKey(CustomUserprofileInterests)      rating = models.SmallIntegerField(choices=WEIGHT)
 

I want to accomplish a rating on each relation in the 'interests = ManyToManyField' in my CustomUserprofile. The Interests-Model HAS to have an OWN, self relating rating in each 'interest' entry, NOT related to the CustomUserprofile.

Startet lot of investigation and the 'through' option seems to be the solution? Don't got it really because in my ModelForm and Admin there is NO field to choose some 'interests' and an option to rate it.
Got absolutley NO idea how to do it, would appreciate any hints.

--
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 http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/ce44e4b5-db58-4fc1-99aa-251ab93e2c88%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment