【问题标题】:django How do I get the user id in the data base with a foreign keydjango 如何使用外键获取数据库中的用户 ID
【发布时间】:2013-04-19 15:42:52
【问题描述】:

我想在用户填写表格时自动获取数据库中的用户 ID,但我不知道我必须做什么。我整天都在努力,我试图通过隐藏的输入来做到这一点,但我不是解决方案。

这是我的代码:

 class ImputationForm(forms.Form):

    user = forms.ModelChoiceField(queryset=User.objects.all(),  widget=forms.HiddenInput())

    morning = forms.BooleanField( required=False)
    afternoon = forms.BooleanField(required=False)
    workpackage = forms.ModelChoiceField(
                                        queryset=Workpackage.objects.all()
                                        )

class ImputationFormModel(ModelForm): 

    class Meta:
        model = Imputation


def imputation(request):

        if request.method == 'POST': # If the form has been submitted...
            form = ImputationForm(request.POST) # A form bound to the POST data 
            f =   ImputationFormModel(request.POST)  

            if form.is_valid(): # All validation rules pass
                user = request.user.id
                morning = form.cleaned_data['morning']
                afternoon = form.cleaned_data['afternoon']
                workpackage = form.cleaned_data['workpackage']
                f.save()

                return render_to_response( 'no/form.html', {'form' :  form, }, context_instance=RequestContext(request))
        else:
            form = ImputationForm()

        return render_to_response( 'no/form.html', {'form' :  form, }, context_instance=RequestContext(request))

【问题讨论】:

  • 您的意思是要自动生成用户 ID?
  • 我解释了我的应用程序,所以用户登录并填写表格。我想通过表单获取数据库中的用户 ID。因此,我在表中的数据库中创建了一个外键用户,我将恢复的所有信息放入表单中。但我不知道如何使用外键用户获取用户 ID。我的模型看起来像上面的 InputationForm。你能帮帮我吗?
  • 我的回答解决了你的问题吗?谢谢。

标签: database django userid


【解决方案1】:

很好的问题。让我们首先从识别应用程序的各行代码的用途开始,看看我们是否能理解它。我看到您现在有两个表格似乎引用了相同类型的数据,这有点多余。我们希望尽可能避免冗余,所以让我们从清理代码开始吧。

我们可以通过您共享的代码来判断您正在尝试:

  1. 允许用户提交包含“上午”、“下午”和“工作包”数据的表单。

  2. 我们不会检查您是否正在编辑实例,因此我们可以假设在成功提交表单后,将在数据库中创建一个新的 Imputation 记录,并将数据传递到其中。

  3. 您要求在客户端隐藏输入 user 值,它将提交的用户 ID 绑定到表单,以便将与用户的关系添加到新保存的插补记录。

通常,您绝不希望允许与客户端用户相关联的敏感或个人数据的隐藏变量。它被认为是一个巨大的安全风险。用户可以使用 Firebug(或其他 DOM 编辑工具)编辑隐藏字段并将用户 ID 绑定到与预期不同的用户。

话虽如此,现在让我们看一下代码:

class ImputationForm(ModelForm): 

    class Meta:
        model = Imputation
        fields = [
            'morning',
            'afternoon',
            'workpackage'
        ]

    # assumed fields of morning, afternoon, workpackage


def imputation(request):

        if request.method == 'POST': # If the form has been submitted...

            form = ImputationForm(request.POST) # A form bound to the POST data 

            if form.is_valid(): # All validation rules pass
                form.user = request.user
                form.save()

                return render_to_response( 'no/form.html', {'form' :  form, }, context_instance=RequestContext(request))
        else:
            form = ImputationForm()

        return render_to_response( 'no/form.html', {'form' :  form, }, context_instance=RequestContext(request))

使用此代码,我们不再询问用户他在表单上的 ID,我们甚至不再在表单中询问它。我们允许 Django 确定当前用户 ID 是什么,并在保存表单之前将其传递给模型。您需要确保模型上的 user 字段设置为 null=True, blank=True 以避免引发异常。

我希望这有助于回答您的问题。

【讨论】:

  • 非常感谢您的回答。但是当我这样做时,用户 ID 不会放入数据库中。我的目的是在用户填写表单时获取它。
  • 这样我就知道是哪个用户填写了表格。
  • 这是我的模型类 Imputation(models.Model):上午 = models.BooleanField(default=False, blank=True) 下午 = models.BooleanField(default=False, blank=True) 工作包 = models.ForeignKey(Workpackage, null=True) user = models.ForeignKey(User, null=True, blank=True)
  • 我想你明白我想要做什么,但你的解决方案不起作用。你有其他想法吗,因为我现在没有想法了。
  • 好吧,我认为至少,如果我的解决方案不起作用(我还没有测试过),你应该寻找一个不同的解决方案,预填充用户ID。在保存/更新要与该对象关联的对象时,您永远不应该从表单中向 Django 询问用户 ID。这是一个巨大的安全风险。另外,您是否需要身份验证才能填写此表格? request.user 只能获取当前登录用户的用户ID,否则返回Anonymous用户,或者NULL。
【解决方案2】:

我发现我真的是 django 的新手,很抱歉打扰你,非常感谢你的帮助,如果没有你,我不会改变我对这个问题的思考方式!!!!!!这是我改变的:

def imputation(request):

    if request.method == 'POST': # If the form has been submitted...

        form = ImputationForm(request.POST) # A form bound to the POST data 

        if form.is_valid(): # All validation rules pass
            #print("%s" % form.user)
            print("%s" % form)
            new = form.save(commit=False) #here
            new.user = request.user #here
            new.save() #here

再次感谢;)

【讨论】:

  • 啊,对,因为我们在表单中省略了对用户字段的要求,所以无法读取。因此,保存表单和变量并将用户绑定到新实例并重新保存它可以工作。很高兴知道。
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2012-08-26
  • 2011-12-23
相关资源
最近更新 更多