我是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))
答案 0 :(得分:4)
您应该阅读create forms from models。 ModelForm
类将使您免于将表单中的字段复制到模型中。
除此之外,这个观点对我来说很正常。
您甚至可以使用通用FormView或CreateView删除一些样板代码(if request.method == "POST"
,if form.is_valid()
等)。由于你接缝有一些特殊的表格处理,它可能没有任何用处,但它可能值得一看。
此代码并非100%完整(您的城市特殊逻辑缺失)但除此之外应该非常完整,并让您了解如何使用通用视图。
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()
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)
url(r'event/add/$', EventCreate.as_view(), name='event_create'),
答案 1 :(得分:1)
我认为这看起来很棒。您已经很好地遵循了文档中的约定。
将request.user
移动到模型肯定是反模式 - 视图函数将在请求/响应循环中提供,因此在此处访问此属性是有意义的。模型对请求/响应一无所知,所以正确保持这些与任何视图行为分离。
我注意到的只是创建一个category
变量,仅用于构建Event
,非常小。