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”的反转。
不确定我是否正确操作了…当我删除模板标记中对变量的任何引用时