1

我有这个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 方法时传递请求用户的名称。我无法做到这一点。从当前场景中,我收到以下错误: 未定义全局名称“请求”

任何帮助都将是可观的

4

1 回答 1

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然后您从您的方法中删除设置用户的部分。

于 2012-05-22T08:44:13.110 回答