Django не может присвоить переменную объектам - PullRequest
1 голос
/ 05 апреля 2020

, когда я пытаюсь добавить данные для многих во многие, как показано в коде представлений ниже

views.py

def playList(request, name, language):
    playlist = {
        'classic': Classic,
    }
    playlist2 = {
        'classic': 'classic',
    }
    num = {
        'ar': 1,
        'en': 2,
    }
    if request.method == 'POST':
        form2 = FavoriteForm(request.POST)
        if form2.is_valid():
            x = Profile.objects.get(user=request.user)
            x.playlist2[name].add(playlist[name].objects.get(id=request.POST.get(playlist2[name])))
    form = playlist[name].objects.filter(lang=num[language])
    context = {}
    for i in form:
        context[i] = i
    context = {
        'form': form,
        'playlist': playlist2[name],

    }
    return render(request, 'playlist.html', context)

получить эту ошибку, что объект str не имеет объектов attr

объект 'str' не имеет атрибута 'objects'

когда я ' m изменить str на istance

, как показано в представлении кода ниже

views.py

def playList(request, name, language):
    playlist = {
        'classic': Classic,
    }
    playlist2 = {
        'classic': Profile.classic,
    }
    num = {
        'ar': 1,
        'en': 2,
    }
    if request.method == 'POST':
        form2 = FavoriteForm(request.POST)
        if form2.is_valid():
            x = Profile.objects.get(user=request.user)
            x.playlist2[name].add(playlist[name].objects.get(id=request.POST.get(playlist2[name])))
    form = playlist[name].objects.filter(lang=num[language])
    context = {}
    for i in form:
        context[i] = i
    context = {
        'form': form,
        'playlist': playlist2[name],

    }
    return render(request, 'playlist.html', context)

я получил это ошибка в том, что в профиле нет атрибута playlist2

У объекта 'Profile' нет атрибута 'playlist2'

, и это код моей модели

modles.py

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)
    workOut = models.ManyToManyField(WorkOut, blank=True)
    chillOut = models.ManyToManyField(ChillOut, blank=True)
    romantic = models.ManyToManyField(Romantic, blank=True)
    happy = models.ManyToManyField(Happy, blank=True)
    sad = models.ManyToManyField(Sad, blank=True)

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

1 Ответ

0 голосов
/ 05 апреля 2020

Вы не можете использовать x.playlist2[name].add, так как при этом будет искать атрибут playlist2 x.

Вы можете использовать getattr(..) [ python -doc] . Если вы выполните getattr(x, 'y'), то это эквивалентно x.y:

def playList(request, name, language):
    playlist = {
        'classic': Classic,
    }
    playlist2 = {
        'classic': <b>'classic'</b>,
    }
    num = {
        'ar': 1,
        'en': 2,
    }
    if request.method == 'POST':
        form2 = FavoriteForm(request.POST)
        if form2.is_valid():
            x = Profile.objects.get(user=request.user)
            <b>getattr(x, playlist2[name])</b>.add(playlist[name].objects.get(id=request.POST.get(playlist2[name])))
    form = playlist[name].objects.filter(lang=num[language])
    context = {}
    for i in form:
        context[i] = i
    context = {
        'form': form,
        'playlist': playlist2[name],

    }
    return render(request, 'playlist.html', context)
...