2

ビューで manytomany フィールドを更新するのに問題があります。フォームが送信された後にこれを返します。

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'

ここにファイルがあります。モデル.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     

フォーム.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

ビュー.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)

モデルフォームを使用していなければうまくいくと思いますが、この日付ピッカーを実装する必要があります。多面的なフィールドなので、データベースに入力するときに分割したいのですが、クエリセットが失敗します。これをさまざまな方法で変更しようとしましたが、行き詰まっています。私は似たような質問をたくさん見てきましたが、それらは外部キーを持っているか、モデルフォームを持っていませんでした。

ありがとう。

編集: 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 %}
4

2 に答える 2

2

エラーが説明QuerySetしているように、 a にはメソッドがありませんsplit。を呼び出すことはできませんmy_qs.split()

form.cleaned_data['groups']きれいなデータを返します。文字列から Python オブジェクトへの変換はすでに処理されています。これは、 a の場合、最終的に Python ではManyToManyFielda で表されます。QuerySet

日付フィールドは日付オブジェクトを返し、IntegerField は整数、CharFields は文字列などをフォーム クリーニングと同じ方法で返します。

のリストがgroup_names必要な場合は、 内のオブジェクトを明示的に繰り返し処理し、QuerySetそれらのgroup_nm属性を取得する必要があります。

            group_names = [x.group_nm for x in form.cleaned_data['groups']]
于 2012-08-26T05:50:30.953 に答える
2

あなたの見解でそれをすべて行う必要があるかどうかはわかりません。オブジェクトを手動で作成して操作することなく、フォームをビューに直接保存できます。

また、既存のアクティビティ インスタンスを更新できるように、アクティビティの ID を取得する必要があります。

を更新しurls.pyて、次の URL を含めるようにしますact_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'),

ビューを次のように変更します。

def activity_save_page(request, act_id=None):
    act_inst = None
    try:
        if act_id:
           act_inst = Activity.objects.get(id=act_id)
    except Exception:
        pass
    if request.method == 'POST':
        form = ActivitySaveForm(request.POST, instance=act_inst)
        if form.is_valid():
            return HttpResponseRedirect('/activity/')
    else:
        form = ActivitySaveForm(instance=act_inst)
    variables = RequestContext(request, {
        'form': form
        })
    return render_to_response('activity_save.html', variables)
于 2012-08-26T05:57:17.300 に答える