【问题标题】:Associating Objects and Users in Django using Generic Views使用通用视图在 Django 中关联对象和用户
【发布时间】:2019-03-26 00:54:06
【问题描述】:

我正在尝试将对象集合与登录用户相关联。

网址.py

urlpatterns = [
path('new/collection', views.CollectionCreate.as_view(), name="create"),
path('edit/collection/<int:pk>', views.CollectionUpdate.as_view(), name='update'),
path('delete/collection/<int:pk>', views.CollectionDelete.as_view(), name='delete'),
]

Views.py

此页面生成一个表单,其中登录的User 输入Collection 的标题并创建它。就像现在一样,Collection 没有与任何用户关联。我知道这是我需要将创建的Collection 附加到登录的User 的点,但我已经到了一个停止点。

class CollectionCreate(CreateView):
    model = Collection
    template_name = 'upload/collection_form.html'
    fields = [
        'title'
    ]

模型.py

在这个类中,一个 Collection 与一个默认的 Django 用户相关联。

class Collection(models.Model):
    user = models.OneToOneField(User, blank=True, null=True, on_delete=models.CASCADE)
    title = models.CharField(max_length=140)
    tags = models.CharField(max_length=140)
    upload_date = models.DateTimeField(auto_now_add=True)

    def get_absolute_url(self):
        return reverse('gallery:detail', kwargs={'pk': self.pk})

    def __str__(self):
        return self.title + ' by ' + self.author

    class Meta:
        ordering = ['-upload_date']

给定一个form.ModelForm,我知道我可以通过在def post(self, ...) 函数中使用form = ModelForm(request.POST) 来访问传递的数据。

我不知道如何在 CreateView 中做到这一点。

【问题讨论】:

    标签: python django associations django-class-based-views django-generic-views


    【解决方案1】:

    看来您应该自定义get_form_kwargs 方法。 get_form_kwargs 获取提供给表单的所有参数,解决您的问题的一种方法是将当前用户注入提供给表单的数据中:

    def get_form_kwargs(self):
        """
        Returns the keyword arguments for instantiating the form.
        """
        kwargs = {
            'initial': self.get_initial(),
            'prefix': self.get_prefix(),
        }
    
        # Add user to form kwargs
        data = self.request.POST.copy()
        data['user'] = self.request.user
    
        if self.request.method in ('POST', 'PUT'):
            kwargs.update({
                'data': data,
                'files': self.request.FILES,
            })
        return kwargs
    

    【讨论】:

    • 这看起来像是可靠的逻辑,尽管我对 kwargs 字典中的初始键和前缀键感到困惑。我在您设置数据中的“用户”键的那一行也遇到了错误,该数据是来自 HttpRequest 的不可变 QueryDict。
    • 我认为initial 将是表单字段“占位符”值,prefix 将预先形成元素名称/ID,因此确保它们是唯一的,可能对具有多个的页面有帮助形式。不可变的 QueryDict 可以通过调用 self.request.POST.copy() 来解决,我已经在我的回答中进行了修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多