我有这个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()
}
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方法时传递请求用户的名称。我无法做到这一点。从当前场景我得到以下错误: 未定义全局名称“请求”
任何帮助都会很明显
答案 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
方法中删除设置用户的部分。