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

2024-04-25 05:57:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django新手,正在寻找我刚刚编写的代码的最佳实践(见下文)。代码当前存在于我的视图.py只是创造了一个新的事件。如果你知道我的意思的话,熟悉其他语言只会让你“难闻”。有人能指出他们将如何完成这个简单的任务吗。在

再次查看我的代码(再多读一点文档)的唯一方法就是请求.用户进入模型.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))

Tags: to代码nameformeventcitydatareturn
2条回答

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

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

{{cd2>只注意到了一个小变量。在

你应该读一读create forms from modelsModelForm类可以避免将字段从表单复制到模型中。在

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

您甚至可以使用泛型FormView或{a3}删除一些样板代码(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在

^{pr2}$

在网址.py在

url(r'event/add/$', EventCreate.as_view(), name='event_create'),

相关问题 更多 >