基于示例代码保存视图的最佳实践

时间:2013-02-01 23:52:55

标签: python django

我是Django的新手,正在寻找我刚才写的代码(下面)的最佳实践。代码当前存在于我的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))

2 个答案:

答案 0 :(得分:4)

您应该阅读create forms from modelsModelForm类将使您免于将表单中的字段复制到模型中。

除此之外,这个观点对我来说很正常。

您甚至可以使用通用FormViewCreateView删除一些样板代码(if request.method == "POST"if form.is_valid()等)。由于你接缝有一些特殊的表格处理,它可能没有任何用处,但它可能值得一看。

此代码并非100%完整(您的城市特殊逻辑缺失)但除此之外应该非常完整,并让您了解如何使用通用视图。

forms.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()

views.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'),

答案 1 :(得分:1)

我认为这看起来很棒。您已经很好地遵循了文档中的约定。

request.user移动到模型肯定是反模式 - 视图函数将在请求/响应循环中提供,因此在此处访问此属性是有意义的。模型对请求/响应一无所知,所以正确保持这些与任何视图行为分离。

我注意到的只是创建一个category变量,仅用于构建Event,非常小。