valueError в моделях форм - PullRequest
       11

valueError в моделях форм

5 голосов
/ 07 января 2012

Я использую модели для получения списка воспроизведения и его элементов.Он также содержит скрипт входа в систему.Я пытаюсь установить в настоящее время вошедшего в систему пользователя для пользовательской модели.Вы можете видеть эту вещь, которую я опубликовал ранее Как избежать этого выпадающего списка?

class playlistmodel(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=200)

    def __unicode__(self):
        return self.title

class itemsmodel(models.Model):
    playlist = models.ForeignKey(playlistmodel)
    item = models.TextField()

    def __unicode(self):
        return self.item

class playlistform(ModelForm):
    class Meta:
        model = playlistmodel
        exclude = {'user'}

class itemsform(ModelForm):
    class Meta:
        model = itemsmodel
        exclude = {'playlist'}

Вот вид списка воспроизведения:

def playlistview(request):
    if request.method == 'POST':
        form = playlistform(request.POST)
        if form.is_valid():
                data = form.save(commit=False)
                data.user = request.user
                data.save()
                return render_to_response('playlist.html', {'data': data})
    else:
        form = playlistform()
        return render_to_response('playlist.html', {'form': form, 'user': request.user}, context_instance=RequestContext(request))

Список воспроизведения.HTML-файл:

https://gist.github.com/1576136

Страница ошибки:

https://gist.github.com/1576186

Но я получаю ValueError:

Exception Type: ValueError Exception Value: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x7f0234028f50>": "playlistmodel.user" must be a "User" instance

Traceback: Local vars --- data.user = request.user

Вот мои settings.py https://gist.github.com/1575856

Спасибо.

Ответы [ 3 ]

5 голосов
/ 24 февраля 2013

Я знаю, что этот пост старый, но если кто-то попадет сюда с такой же проблемой, ответ таков: request.user на самом деле является оберткой для auth.user Джанго. Таким образом, request.user - это SimpleLazyObject, и его цель - избежать ненужных реализаций, а также реализовать простой механизм кэширования пользователей. Чтобы получить доступ к реальному пользователю (и создать его экземпляр при первом обращении), вам нужно сделать:

auth.get_user(request)

Это даст вам экземпляр auth.user. Если вам нужно больше подробностей о том, что происходит внутри, см. этот пост .

0 голосов
/ 26 июля 2012

У меня та же проблема, но она возникает только тогда, когда ни один пользователь не вошел в систему (ожидается экземпляр AnonymousUser).По крайней мере, когда мой суперпользователь вошел в систему, я не нашел никаких проблем.

Несмотря на то, что я еще не нашел решения, возможно, вы найдете подсказку в этом ответе

Ну, теперь я понял, что в моем случае AnonymousUser должен храниться как нулевой в БД, но оставьте этот ответ, чтобы опубликовать ссылку-подсказку (пока у вас нет разрешения оставлять комментарии).

Надеюсь, это поможет!

0 голосов
/ 08 января 2012

трудно сказать, но я бы попробовал это в вашем списке воспроизведения:

form = playlistform(request, request.POST, instance=playlistmodel)

возможно, вы можете пропустить последний параметр (instance = playlistmodel), потому что это понадобится только в случае изменения существующегообъект

Надеюсь, это поможет ...

...