0

Get Primary Key after Saving a ModelForm in Djangoで q&a を使用していました 。

それはまさに私がしなければならないことと一致しています。

私は次のモデルを持っています:

class meetingEvent(models.Model):
    '''
    A meeting event
    '''

    name = models.CharField(max_length=64, help_text="a name for this meeting")
    account_number = models.ForeignKey(account)
    meeting_type = models.ForeignKey(meetingType)
    meeting_group = models.ForeignKey(meetingGroup)
    start_time = models.DateTimeField(help_text="start time for this event")
    end_time = models.DateTimeField(help_text="end time for this event")
    created_time = models.DateTimeField(auto_now_add=True)
    listed_products = models.ForeignKey(product)
    additonal_notes = models.TextField(help_text="additional notes for this meeting")

    def __unicode__(self):
        return self.name

私は次のフォームを持っています:

class meetingEventForm(forms.ModelForm):
    """
    to create a new meeting event.
    """
    portal_user = forms.CharField(help_text="username to access portal data")
    portal_pass = forms.CharField(widget=forms.PasswordInput, help_text="password to add access portal data")

    def save(self, commit=True):

        super(meetingEventForm, self).save(commit=commit)

    class Meta:
        model = meetingEvent

私は次の見解を持っています:

def meeting_event(request):

    if request.method == 'POST':
        form = meetingEventForm(request.POST)
        if form.is_valid():
            new_agenda=form.save()

            return HttpResponseRedirect(reverse('agenda_detail', args=(new_agenda.pk,)))

    else:
        form = meetingEventForm()
        return render_to_response('agendas/event.html',{'form':form,}, context_instance=RequestContext(request))

これでデータベースにきれいに入ることが確認できました。ただし、次のエラーが表示されます。

Traceback:
File "/usr/lib/python2.6/site-packages/Django-1.5.2-py2.6.egg/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.6/site-packages/Django-1.5.2-py2.6.egg/django/contrib/auth/decorators.py" in _wrapped_view
  25.                 return view_func(request, *args, **kwargs)
File "/var/www/html/tamtools/agendas/views.py" in meeting_event
  44.             return HttpResponseRedirect(reverse('agenda_detail', args=(new_agenda.pk,)))

Exception Type: AttributeError at /agendas/add/
Exception Value: 'NoneType' object has no attribute 'pk'

私が知らない Django 1.5 で何か変更がありましたか? new_agenda は meetingEventForm タイプである必要がありますね。

4

2 に答える 2

2

モデルフォームの保存メソッドを上書きしましたが、モデルを返すのを忘れました。

return super( ....
于 2013-09-14T09:47:59.047 に答える
1

ModeForm 保存メソッドをオーバーライドする必要はありません。特別なことは何もしていないからです。ModelForm は次のようになります。

class MeetingEventForm(forms.ModelForm):
    """
    to create a new meeting event.
    """
    class Meta:
        model = meetingEvent

また、Pythonスタイル ガイドに準拠するようにクラス名を変更しました。

フォームには、モデルとは関係のない 2 つの追加フィールドもあります。2 つの理由が考えられます。1 つは、これらのフィールドを別のモデルに保存する必要があるか、2 番目のオプションは、誰かが新しいイベントを追加する前に自分自身を承認してほしいということです。

2 番目の方がもっともらしいので、ビューからフォームへのアクセスを制限します。

from django.contrib.auth.decorators import login_required
from django.shorcuts import render, redirect

@login_required()
def meeting_event(request):
    form = MeetingEventForm(request.POST or {})
    context = {'form': form}

    if request.method == 'POST':
        if form.is_valid():
            new_agenda = form.save()
            return redirect('agenda_detail', args=(new_agenda.pk,))
        else:
            return render(request, 'agendas/event.html', context)
    else:
        return render(request, 'agendas/event.html', context)

これは一般的なタスクであり、django 1.5 を使用しているので、ジェネリッククラス ベースのビューを使用しないのはなぜですか?

コードが削減され、ありふれた詳細について心配する必要がなくなります。

まず、 で、モデルのモデル フォームを表示するために使用されるviews.pyジェネリックから継承するクラスを作成し、ユーザーに入力させて、詳細を保存します。CreateView

from django.views.generic.edit import CreateView

class CreateMeetingRequest(CreateView):
    template_name = 'agendas/event.html'
    model = meetingRequest

ここで、ビューを URL にマップするために、それを に追加しurls.pyます。また、ユーザーが会議出席依頼を追加する前にログインする必要があるため、login_requiredデコレーターがそれを処理します。ユーザーがログインしているかどうかを確認します。ログインしていない場合は、ユーザーをログインフォームにリダイレクトし、ログインしたらフォームにリダイレクトします。

from django.contrib.auth.decorators import login_required

from .views import CreateMeetingRequest

urlpatterns = patterns('',
    # your other views
    url(r'meeting-request/add/$',
        login_required(CreateMeetingRequest.as_view()), name='add-meeting-req'),
)

最後に、フォームが成功したらどこに行くべきかをビューに伝える必要があります。CreateViewモデルにget_absolute_urlメソッドがあるかどうかを確認し、それを呼び出します。だからあなたのmodels.py

from django.core.urlresolvers import reverse

class meetingRequest(models.Model):

    # your normal fields

    def get_absolute_url(self):
       return reverse('agenda_detail', args=(self.pk,))
于 2013-09-14T10:13:56.423 に答える