【问题标题】:Django forms request.userDjango 表单 request.user
【发布时间】:2011-04-01 17:33:39
【问题描述】:

我的模型用户可以创建步枪,而这支步枪显然与用户相关联。

class Gun(ImageModel):
    user = models.ForeignKey(User)  
    ...  
    ...  
    ...

我有另一个依赖于此的模型,需要使用用户的步枪,但是当用户添加记录时,我只想显示他的步枪。

mt 模型如下所示

class Trophies(ImageModel):  
    used_his = models.ForeignKey(Gun)

我的表单如下所示

from django.forms import ModelForm
from django import forms
from models import Trophies
from gunsafe.models import Gun
from django.contrib.auth.models import User

class TrophiesForm(request.user, ModelForm):
    used_his = forms.ModelMultipleChoiceField(queryset=Gun.objects.filter(user__id=1))

    def __init__(self, user, *args, **kwargs):
        super(TrophiesForm, self).__init__(*args, **kwargs)
        self.fields['used_his'].queryset = User.objects.filter(pk = user)

我想知道如何获取当前登录的用户 ID 而不是 user__id=1

这是视图。

def edit(request, trophy_id, template_name='trophies/edit.html'):
    trophy = Trophies.objects.get(pk=trophy_id)

    if request.method == 'POST':
        form = TrophiesForm(request.POST, request.FILES, instance=trophy)
        if form.is_valid():
            newform = form.save(commit=False)
            newform.user = request.user
            newform.save()  
            ...  
            ...

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    我认为您可以通过覆盖表单的__init__() 方法、传入User 的实例并使用该用户过滤queryset 来实现此目的。像这样的:

    class TrophiesForm(ModelForm):
        used_his = forms.ModelMultipleChoiceField(queryset=Gun.objects.filter(user__id=1))
    
        def __init__(self, user, *args, **kwargs):
            super(TrophiesForm, self).__init__(*args, **kwargs)
            self.fields['used_his'].queryset = User.objects.filter(pk = user.id)
    

    在您看来,您可以传入适当的(当前登录的)User 实例。

    def my_trophies(request, *args, **kwargs):
        user = request.user
        form = TrophiesForm(user)
        ... 
    

    【讨论】:

    • 我修改了一些代码并将视图粘贴在那里。基于此,我仍然得到一个错误。 __init__() 至少需要 2 个参数(给定 1 个),也许你可以指出我在哪里出错了。非常感谢
    • @ApPel:您可以将用户实例作为 first 参数传递给表单的构造函数并重试吗? form = TrophiesForm(request.user, ...).
    • 基于我添加 request.user 作为第一个参数时的更改,我刚刚得到'name "request" is not defined'
    • @Manoj:为您粘贴了更新版本。顺便说一句,感谢您的帮助!
    • @ApPel:您模型中的这一行是错误的。 self.fields['used_his'].queryset = User.objects.filter(pk = user)。过滤器应该是pk = user.id
    【解决方案2】:

    Manoj 提交的另一个角度...

    使用 kwarg 来传递用户数据,以免弄乱方法签名,因为它需要 request.POST 作为第一个参数。更好的约定如下。

    class TrophiesForm(ModelForm):
        def __init__(self, *args, **kwargs):
            #using kwargs
            user = kwargs.pop('user', None)
            super(TrophiesForm, self).__init__(*args, **kwargs)
            self.fields['used_his'].queryset = User.objects.filter(pk = user.id)
    

    现在在调用中,这更加明确并遵循更好的签名约定

    form = TrophiesForm(request.POST, request.FILES, user=request.user)
    

    您也可以使用实例:(在获取实例 obj 之前注意 super)

    class TrophiesForm(ModelForm):
        def __init__(self, *args, **kwargs):
            super(SubmissionUploadForm, self).__init__(*args, **kwargs)
            user = self.instance.user
            self.fields['used_his'].queryset = User.objects.filter(pk = user.id)
    

    然后你可以像这样调用你的views.py:

    form = TrophiesForm(instance=*MyModel*(user=request.user))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 2019-09-29
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2012-08-26
      • 1970-01-01
      相关资源
      最近更新 更多