2012-05-22 56 views
1

传值的Django的ModelForm我有这个form.py:如何InputHidden charField从另一个模型

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() 
    } 
    时区是从model.py定义主机模型的输入隐藏字段。
    get_timezone方法:(定义如下)
def get_timezone(user=None): 
timezone = Userprofile.objects.all() 
timezone = timezone.get(user=user) 
return timezone.timezone 

而用户配置是另一种模式中models.py还定义了用于将时区,姓和名的用户的存储在他/她的注册时间。我的主要动机是从Userprofile模型获取此默认时区,并将其传递到该隐藏输入字段(时区)。 我试着用上面的代码(host1.timezone = get_timezone(user = user)用save方法写的调用get_timezone方法,并且它应该为一个已登录的用户返回时区格式Userprofile模型,但它不起作用

我认为主要的问题是来自请求用户在调用get_timezone方法时从保存方法传入的名称。我无法做到这一点。从目前的情况我收到以下错误: 全局名称“请求”没有定义

任何帮助将很可观

回答

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方法设置用户的部件。

+0

Thenx用于回复Fallen。但还有另外一个问题,我无法将请求用户或登录用户传递给get_timezone方法(请参阅save方法)。根据保存方法中的上述定义,我得到这个错误:没有定义全局名称请求 –

+0

现在我已经更新了这个问题。请检查:) –

+0

答复更新... – FallenAngel