在此示例中,如何保存用户实例而不是用户字符串?

时间:2014-11-16 10:47:05

标签: django django-views

我制作了一个表单来审核您正在查看其个人资料的用户。我试图将URL中的用户名(此处名为test)直接传递给视图。我收到以下错误。

ValueError at /reviewseller/Benino/
Cannot assign "u'Benino'": "UserReview.name" must be a "User" instance.

Models.py

class UserReview(models.Model):
    name= models.ForeignKey(User, related_name='usersbeingreviewed', null=True, blank=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='reviewauthors')
    pub_date=models.DateTimeField(auto_now_add=True)
    stars = models.IntegerField(max_length=5)
    comment = models.CharField(max_length=100)

    def __str__(self):
        return u'%s %s %s %s %s' % (self.name, self.author, self.pub_date, self.stars, self.comment)

URLS.py

urlpatterns = patterns('',

    url(r"^reviewseller/(?P<test>\w+)/$", get_review))

Views.Py

def get_review(request, test):
    if request.method == 'POST':
        p = UserReviewForm(request.POST)
        if p.is_valid():
            reviewform=p.save(commit=False)
            reviewform.name=test
            reviewform.author=request.user
            reviewform.save()
            return HttpResponseRedirect('/thanks/')

我是否需要在视图中添加内容以按用户名筛选所有现有实例?或类似的东西?如何将字符串转换为用户实例?

1 个答案:

答案 0 :(得分:0)

我不太明白你在is_valid子句中的视图中做了什么:测试未定义。

这里最简单的方法是在表单上定义clean_name,按名称查找使用并返回它:

def clean_name(self):
    try:
        user = User.objects.get(name=self.cleaned_data['name'])
    except User.DoesNotExist:
        raise forms.ValidationError("Enter a valid name")
    return user