Django';QuerySet';对象没有属性';拆分';使用modelform
我在获取视图以更新多个字段时遇到问题。它在提交表单后返回该值Django';QuerySet';对象没有属性';拆分';使用modelform,django,django-forms,django-queryset,Django,Django Forms,Django Queryset,我在获取视图以更新多个字段时遇到问题。它在提交表单后返回该值 Traceback: File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 111. response = callback(request, *callback_args, **callback_kwargs) File "/home/footbook/U
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/home/footbook/Ubuntu One/webapps/fb/poc/../poc/activity/views.py" in activity_save_page
44. group_names = form.cleaned_data['groups'].split()
Exception Type: AttributeError at /activity_save/
Exception Value: 'QuerySet' object has no attribute 'split'
这是文件。
Models.py
class Group (models.Model):
group_nm = models.CharField(max_length=64)
group_desc = models.CharField(max_length=250)
created = models.DateTimeField(auto_now_add=True)
active_yn = models.BooleanField(default=True)
def __unicode__(self):
return self.group_nm
class Activity(models.Model):
activity_nm = models.CharField(max_length=60)
activity_desc = models.CharField(max_length=250)
startdt = models.DateField()
enddt = models.DateField()
crdt = models.DateTimeField(auto_now_add=True,editable=False)
groups = models.ManyToManyField(Group)
upddt = models.DateTimeField(editable=False)
def save(self, *args, **kwargs):
if not self.id:
self.crdt = datetime.date.today()
self.upddt = datetime.datetime.today()
super(Activity, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
forms.py
def make_custom_datefield(f):
formfield = f.formfield()
if isinstance(f, models.DateField):
formfield.widget.format = '%m/%d/%Y'
formfield.widget.attrs.update({'class':'datePicker', 'readonly':'true'})
return formfield
class ActivitySaveForm(forms.ModelForm):
formfield_callback = make_custom_datefield
def __init__(self, *args, **kwargs):
super(ActivitySaveForm, self).__init__(*args, **kwargs)
self.fields['activity_nm'].label = "Activity Name"
self.fields['activity_desc'].label = "Describe It"
self.fields['startdt'].label = "Start Date"
self.fields['enddt'].label = "End Date"
self.fields['groups'].label ="Group"
class Meta:
model = Activity
views.py
def activity_save_page(request):
if request.method == 'POST':
form = ActivitySaveForm(request.POST)
if form.is_valid():
act, created = Activity.objects.get_or_create(
activity_nm = form.cleaned_data['activity_nm']
)
act.activity_desc = form.cleaned_data['activity_desc']
if not created:
act.group_set.clear()
group_names = form.cleaned_data['groups'].split()
for group_name in group_names:
group, dummy = Group.objects.get_or_create(group_nm=group_name)
act.group_set.add(group)
act.save()
return HttpResponseRedirect('/activity/')
else:
form = ActivitySaveForm()
variables = RequestContext(request, {
'form': form
})
return render_to_response('activity_save.html', variables)
我认为如果我不使用modelform,它会起作用,但我需要它来实现,因为它是一个很多字段,我想在将它们输入数据库时分割它们,但是我的queryset失败了。我尝试了很多不同的方法来改变这一点,但我被卡住了。我见过很多类似的问题,但它们要么有外键,要么没有模型
谢谢
编辑:
activity_save.html
{% extends "base.html" %}
{% block title %}Save Activity{% endblock %}
{% block head %}Save Activty{% endblock %}
<input class="datePicker" readonly="true" type="text" id="id_startdt" />
<input class="datePicker" readonly="true" type="text" id="id_enddt" />
{% block content %}
<form action="{% url activity.views.activity_save_page act_id%}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="save it" />
</form>
{% endblock %}
{%extends“base.html”%}
{%block title%}保存活动{%endblock%}
{%block head%}保存活动{%endblock%}
{%block content%}
{%csrf_令牌%}
{{form.as_p}}
{%endblock%}
与错误描述完全相同:QuerySet
没有split
方法。您不能调用my_qs.split()
form.cleaned_data['groups']
返回已清理的数据;它已经为您处理了从表单字符串到python对象的转换,在ManyToManyField
的情况下,它最终由python中的QuerySet
表示
日期字段通过表单清理以相同的方式返回日期对象、整数字段和字符串等
如果您想要一个组名称列表
,则需要显式迭代查询集
中的对象,并提取它们的组名称
属性
group_names = [x.group_nm for x in form.cleaned_data['groups']]
正如错误描述的那样:
QuerySet
没有split
方法。您不能调用my_qs.split()
form.cleaned_data['groups']
返回已清理的数据;它已经为您处理了从表单字符串到python对象的转换,在ManyToManyField
的情况下,它最终由python中的QuerySet
表示
日期字段通过表单清理以相同的方式返回日期对象、整数字段和字符串等
如果您想要一个组名称列表
,则需要显式迭代查询集
中的对象,并提取它们的组名称
属性
group_names = [x.group_nm for x in form.cleaned_data['groups']]
我不确定你是否需要在你看来做所有这些。您可以直接在视图中保存表单,而无需手动创建对象并对其进行操作 此外,您需要获取活动的id,以便可以更新现有的活动实例 更新
url.py
以使这些URL具有act\u id
:
url(r'^activity_app/save/(?P<act_id>\d+)/$', 'activity_app.views.activity_save_page'),
url(r'^activity_app/save/$', 'activity_app.views.activity_save_page'),
我不确定你是否需要在你看来做所有这些。您可以直接在视图中保存表单,而无需手动创建对象并对其进行操作 此外,您需要获取活动的id,以便可以更新现有的活动实例 更新
url.py
以使这些URL具有act\u id
:
url(r'^activity_app/save/(?P<act_id>\d+)/$', 'activity_app.views.activity_save_page'),
url(r'^activity_app/save/$', 'activity_app.views.activity_save_page'),
谢谢你的详细回复。不过,这种方法有一个不同的错误:
局部变量'act\u inst'在赋值之前被引用
。该错误引用了表单创建(当它不是帖子时)。为什么在最初创建表单时,我希望表单期望设置变量,因为没有发布数据?再次感谢@刺拳哦是的,当act\u id
为None
act\u inst
时,将不会定义刺拳。请检查更新的答案。这一次,我发现了一个捕获到的NoReverseMatch
错误。以下是我在模板中的调用:{%csrf\u token%}
我尝试了许多不同的方法调用该act\u id值,但都以相同的错误结束。此外,当我尝试反向查找反向('poc.views.activity\u save\u page')
时,我得到了相同的错误:文件“”,文件中的第1行“/usr/local/lib/python2.7/dist packages/django/core/urlresolvers.py”,第391行,反向为*args,**kwargs)))文件“/usr/local/lib/python2.7/dist packages/django/core/urlresolvers.py”,第337行,反向为“未找到参数”。%(查找视图,args,kwargs))NoReverseMatch:找不到参数为“()”且关键字参数为“{}”的“poc.views.activity_save_page”的反转。
不确定是否正确…当我删除模板标记中对变量的任何引用时{%url activity.views.activity_save_page%}
只需调用页面,视图就可以正确形成并接受输入,但不会更新或插入数据库。我如何才能找出视图失败的地方?感谢详细的响应。不过,这种方法会导致另一个错误:局部变量'act_inst'在赋值之前引用。
。错误引用了当表单不是发布时创建表单。为什么在表单最初创建时,我希望表单设置变量,因为没有发布数据?再次感谢!@jabs哦,是的,当act\u id
为无时,不会定义act\u inst
。请检查更新的答案。这一次,我捕获了NoReverseMatch
错误。这是我在模板中的调用:{%csrf\u token%}
我尝试了许多不同的方法调用该act\u id值,但都以相同的错误结束。另外,当我尝试反向查找反向('poc.views.activity\u save\u page')
时,我得到了相同的错误:文件中的第1行/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py”,第391行,反向为*args,**kwargs)))文件“/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py”,第337行,反向为“未找到参数“%s”。%(查找视图,args,kwargs))NoReverseMatch:找不到参数为“()”且关键字参数为“{}”的“poc.views.activity_save_page”的反转。
不确定我是否正确操作了…当我删除模板标记中对变量的任何引用时