如何将值传递给另一个模型的InputHidden charField中的Django-Modelform

时间:2012-05-22 08:36:51

标签: django django-models django-forms

我有这个form.py:

 from shortcut import get_timezone
 class HostCreateForm(forms.ModelForm):
     def save(self, commit=True):
         host1 = super(HostCreateForm, self).save(commit=False)
         user = request.user.username 
         host1.timezone=get_timezone(user=user)
         host1.save()
         return host1

 class Meta:
     model = Host
     widgets = {
         'user': forms.HiddenInput(),
         'timezone': forms.HiddenInput()
     }
    timezone 是来自model.py中定义的主机模型的输入隐藏字段。
    get_timezone 方法:(定义如下)
 def get_timezone(user=None):
 timezone = Userprofile.objects.all()
 timezone = timezone.get(user=user)
 return timezone.timezone

而UserProfile是另一个在models.py中定义的模型,用于存储用户注册时的时区,名字和姓氏。我的主要动机是从Userprofile模型获取此默认时区并将其传递给隐藏的输入字段(时区)。 我尝试使用上面的代码(host1.timezone = get_timezone(user = user)编写的save方法调用get_timezone方法,它应该为登录用户返回时区形式的Userprofile模型,但它不起作用。

我认为主要的问题是在从save方法调用get_timezone方法时传递请求用户的名称。我无法做到这一点。从当前场景我得到以下错误: 未定义全局名称“请求”

任何帮助都会很明显

1 个答案:

答案 0 :(得分:2)

timezone = timezone.filter(user=user)
return timezone.timezone

timezone.filter(...)会返回一个查询集,您无法在查询集上调用.timezone。您必须使用get

获取相关对象
timezone = timezone.get(user=user)

或通过列表切片:

timezone = timezone.filter(user=user)[0]

更新:好的,我只是注意到了。

问题是,您无法将请求对象传递给表单的save方法。处理问题的最佳方法是在视图层中执行此操作。

在您看来:

my_form = HostCreateForm(request.POST):
    if my_form.is_valid(): #do the validation
        my_inst = my_form.save(commit=False) #pass the form values to a new model instance without saving.
        my_inst.timezone = request.user.username #set the user or do whhatever you want eith the form data.
        my_inst.save() #that will call your save methhod that you override.

然后从save方法中删除设置用户的部分。