1

我是 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))
4

2 回答 2

4

您应该阅读有关从模型创建表单的信息。该类ModelForm将使您免于将字段从表单复制到模型。

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

您甚至可以使用通用FormViewCreateView摆脱一些样板代码(if 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)

网址.py

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

我觉得这看起来很棒。您很好地遵循了文档中的约定。

迁移request.user到模型肯定是一种反模式——视图函数是在请求/响应循环中服务的,所以在这里访问这个属性是有意义的。模型对请求/响应一无所知,因此将这些与任何视图行为分离是正确的。

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

于 2013-02-02T00:31:18.737 回答