1

私は Django を初めて使用し、今書いたコード (以下) のベスト プラクティスを探しています。コードは現在 my view.py に存在し、新しいイベントを作成するだけです。他の言語に慣れ親しんでいると、私の言いたいことがわかっていても、「臭い」だけです。誰かがこの単純なタスクをどのように行うかを指摘できますか.

私のコードをもう一度見て(そしてドキュメントをもう少し読んで)唯一のことは、request.userをmodels.py保存関数に移動することです。

以下の初心者の大きな間違いは他にありますか?

@login_required
def event_new(request):
    # If we had a POST then get the request post values.
    if request.method == 'POST':
        form = EventForm(request.POST)
        # Check we have valid data
        if form.is_valid():
            # If form has passed all validation checks then continue to save it.
            city = City.objects.get(name=form.cleaned_data['autocompleteCity'])
            category = form.cleaned_data['category']
            event = Event(
                name=form.cleaned_data['name'],
                details=form.cleaned_data['details'],
                date=form.cleaned_data['date'],
                start=form.cleaned_data['start'],
                end=form.cleaned_data['end'],
                category=category,
                city=city,
                user=request.user,
            )
            event.save()

            messages.add_message(request, messages.SUCCESS, 'Event has been created.')
            return HttpResponseRedirect('/events/invite/')
        else:
            messages.add_message(request, messages.ERROR, 'Error')
            context = {'form': form}
            return render_to_response('events/event_edit.html', context, context_instance=RequestContext(request))
    else:
        form = EventForm

    context = {'form': form}
    return render_to_response('events/event_edit.html', context, context_instance=RequestContext(request))
4

2 に答える 2

4

モデルからのフォームの作成について読む必要があります。このModelFormクラスにより、フィールドをフォームからモデルにコピーする必要がなくなります。

それを除けば、このビューは私にはかなり普通に見えます。

一般的なFormViewまたはCreateViewif request.method == "POST"を使用して、ボイラープレート コード ( 、if form.is_valid()など)の一部を取り除くこともできます。特別なフォーム処理を行う必要があるため、役に立たないかもしれませんが、一見の価値があるかもしれません。

このコードは 100% 完全ではありませんが (都市の特別なロジックが欠落しています)、それ以外はかなり完全であり、一般的なビューをどのように使用できるかを理解できるはずです。

フォーム.py

from django.forms import ModelForm

class EventForm(ModelForm):

    def __init__(self, user, **kwargs):
        self.user = user
        super(EventForm, self).__init__(**kwargs)

    class Meta:
        model = Event

    def save(self, commit=True):
        event = super(EventForm, self).save(commit=False)
        event.user = self.user
        if commit:
            event.save()

ビュー.py

from django.views.generic.edit import CreateView

class EventCreate(CreateView):
    model = Event
    form_class = EventForm
    template = "events/event_edit.html"
    success_url = "/events/invite/" # XXX use reverse()

    def get_form(form_class):
        return form_class(self.request.user, **self.get_form_kwargs())

    def form_valid(form):
        form.user = self.request.user

        messages.success(request, 'Event has been created.')
        super(EventCreate, self).form_valid(form)

    def form_invalid(form):
        messages.error(request, 'Error')
        super(EventCreate, self).form_invalid(form)

urls.py

url(r'event/add/$', EventCreate.as_view(), name='event_create'),
于 2013-02-02T00:35:56.450 に答える
1

これは素晴らしいと思います。ドキュメントの規則にうまく従っています。

モデルへの移行request.userは確かにアンチ パターンです。ビュー関数は要求/応答ループで機能するため、ここでこのプロパティにアクセスすることは理にかなっています。モデルはリクエスト/レスポンスについて何も知らないため、これらをビューの動作から分離しておくのは正しいことです。

私が気付いた唯一のことは、非常にマイナーなcategoryの構築にのみ使用される変数 outを作成することでした。Event

于 2013-02-02T00:31:18.737 に答える