0

我想在用户填写表格时自动获取数据库中的用户 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))
4

2 回答 2

0

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

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

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

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

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

通常,您绝不希望允许与客户端上的用户相关联的敏感或个人数据的隐藏变量。它被认为是一个巨大的安全风险。用户可以使用 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在模型上设置为,以避免引发异常。

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

于 2013-04-20T09:14:58.973 回答
0

我发现我真的是 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

再次感谢 ;)

于 2013-04-22T12:34:31.973 回答