简体   繁体   中英

Django many-to-many fields

i want to add in only one user from Available classic to Chosen classic but not from admin page from view when user click on button

在此处输入图像描述

I tried this

pro = Profile(user=request.user)
pro.classic.add(name='Frank Sinatra-i love you baby')

but i get tthis error

在此处输入图像描述

Before adding any objects to a many-to-many relation, the both side of many-to-many objects must obtain their id , so they should be saved first. Another problem in this code is you need to construct a Classic object before you add it to chosen ones. The add method receives objects, not parameters of model constructor.

May following code example helps you:

pro, _ = Profile.objects.get_or_create(user=request.user)
your_classic = Classic.objects.create(name='Frank Sinatra-i love you baby')
pro.classic.add(your_classic)

give me this error

在此处输入图像描述

mu model code

from django.db import models

# Create your models here.

from django.utils import timezone
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver



class RequestSong(models.Model):
    music = models.CharField(max_length=150, blank=False, null=False)
    stampDate = models.DateTimeField(default=timezone.now, blank=False, null=False)

    def __str__(self):
        return self.music


class HelpUser(models.Model):
    email = models.EmailField(blank=False, null=False)
    helpMessege = models.TextField(blank=False, null=False)
    stampDate = models.DateTimeField(default=timezone.now)
    def __str__(self):
        return str(self.email)


class Language(models.Model):
    language = models.CharField(
        max_length=2, 
        choices=[
            ('AR', 'Arabic'),
            ('EN', 'English'),
        ],
        default='AR'
    )

    def __str__(self):
        return self.language



class ChillOut(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Sad(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Happy(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Romantic(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class WorkOut(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Classic(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)


    def __str__(self):
        return self.name

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    classic = models.ManyToManyField(Classic, blank=True, null=True)
    workOut = models.ManyToManyField(WorkOut, blank=True, null=True)
    chillOut = models.ManyToManyField(ChillOut, blank=True, null=True)
    romantic = models.ManyToManyField(Romantic, blank=True, null=True)
    happy = models.ManyToManyField(Happy, blank=True, null=True)
    sad = models.ManyToManyField(Sad, blank=True, null=True)

    def __str__(self):
        return str(self.user)


# class Favorite(models.Model):
#     name = models.CharField(max_length=50, blank=False, null=False)
#     fav = models.ForeignKey(ChillOut, on_delete=models.CASCADE)
#     pro = models.ForeignKey(Profile, on_delete=models.CASCADE)

#     def __str__(self):
#         return self.name






def update_user_profile(sender, **kwargs):
    if kwargs['created']:
        user = Profile.objects.create(user=kwargs['instance'])

post_save.connect(update_user_profile,sender=User)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM