Я новичок в 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))
1
Prometheus 2 Фев 2013 в 03:52

2 ответа

Лучший ответ

Вам следует прочитать о создании форм из моделей. Класс ModelForm избавит вас от копирования полей из формы в модель.

Кроме того, эта точка зрения выглядит вполне нормально для меня.

Вы даже можете избавиться от некоторого стандартного кода (if request.method == "POST", if form.is_valid() и т. Д.) С помощью универсального FormView или CreateView. Поскольку вам кажется, что для обработки какой-то особой формы вам это не нужно, это может быть бесполезно для вас, но на это стоит обратить внимание.

Этот код не завершен на 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'),
4
bikeshedder 2 Фев 2013 в 01:02

Я думаю, это выглядит великолепно. Вы хорошо следовали правилам из документов.

Перемещение request.user в модель, безусловно, было бы против паттерна - функция views должна служить в цикле запрос / ответ, поэтому доступ к этому свойству здесь имеет смысл. Модели ничего не знают о запросах / ответах, поэтому правильно держать их в стороне от любого поведения представления.

Единственное, что я заметил, это создание переменной category, которая будет использоваться только для построения Event, очень незначительного.

1
markdsievers 2 Фев 2013 в 00:37