只有在用户登录时才能创建与创建视图相对应的表单

时间:2014-08-03 20:22:44

标签: django django-views

我有一个项目的以下模型:

#models.py
class Item(models.Model):
    seller = models.ForeignKey(settings.AUTH_USER_MODEL)
    name = models.CharField(max_length=200)

要制作新商品,我的表格位于www.mysite.com/new-item。当前登录的用户将自动设置为项目的卖家,因此不会显示在表单中。

#forms.py
class ItemCreationForm(forms.ModelForm):
     class Meta:
         model = Item
         fields = ['name',]

以下是相应的观点。

#views.py
class AddNewItem(CreateView):
    model = Item
    form_class = ItemCreationForm
    template_name = 'add_listing.html'
    success_url = '/listings/'

    def form_valid(self, form):
        item = form.save(commit=False)
        #if not self.request.user.is_anonymous and self.request.user.is_email_verified:
            item.seller = self.request.user
        #else:
        #    return redirect('accounts/login/')
        item.save()
    return super(AddNewListing, self).form_valid(form)

注释掉的线条是我遇到的麻烦。我希望用户只有在登录后才能访问www.mysite.com/new-item。如果他不是,我希望他被重定向到注册页面。现在,无论我是否注册,我都可以访问表单,只有在按下表单上的提交按钮时才会重定向到此页面。我也尝试将@login_required装饰器放在form_valid方法之上,但那并没有用。

有人能就我做错的事情向我提出一些建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

随着一些游戏,我终于通过使用mixin来实现这一点。

class AddNewItem(LoginRequiredMixin, CreateView):
        model = Item
        form_class = ItemCreationForm
        login_url = "/signup/"

 ....

比我想象的容易得多!