Джанго: Как мне получить доступ к данным постов и сопоставить их с критериями - PullRequest
1 голос
/ 12 марта 2012

Мне нужны некоторые рекомендации по внедрению наилучшей практики:

У меня есть сценарий, в котором я создаю приложение, но если оно соответствует определенной «категории» или «локали» и хочу перенаправить егоПерейдите на страницу между прочим, просто идите по обычному маршруту.

Вот мой простой views.py

if form.is_valid():
    ...
    kwargs = {'project_id':project_id, 'categories':request.POST['categories'], 'locale':request.POST['locale']}
    process_se(request, **kwargs)
    return HttpResponseRedirect(obj.next_url)

Вот что у меня есть в моем файле models.py, но, похоже,очень противоречивоЕсть ли лучший способ обработать этот запрос?

def process_se(self, request, **kwargs):
    if "All" or "Sweden" in kwargs['locale']:
        if "Technology" or "Internet" in kwargs['categories']:    
            next_url = request.build_absolute_uri(reverse('project_new_se', kwargs={'project_id': self.id}))
    else:
        next_url = request.build_absolute_uri(reverse('project_new_step2', kwargs={'project_id': self.id}))
    self.next_url = next_url

ОБНОВЛЕНИЯ:

Я использую forms.ModelForm, categories и locales - это ManyToManyField, которые я моделировалa for в оболочке и, похоже, по-прежнему не дает результата

Вот вывод cleaned_data

f.cleaned_data
{'locale': [<Locale: Sweden>, <Locale: All>], 'categories': [<Category: Technology>, <Category: Internet>]}

Хотя выполнение этого для полей в форме, кажется, прекрасно отрисовывается на основе вашего решения

1 Ответ

3 голосов
/ 13 марта 2012

Первоначально я предложил поместить этот код в класс формы, но ApPeL пересмотрел вопрос, чтобы указать, что locale и categories являются полями «многие ко многим» в модели.Итак, теперь я предлагаю добавить такой метод в вашу модель:

def requires_swedish_setup(self):
    """
    Return True if this project requires extra Swedish setup.
    """
    return (self.locale.filter(name__in = ('All', 'Sweden')).exists())
            and self.categories.filter(name__in = ('Technology', 'Internet')).exists())

, а затем реализовать ваше представление следующим образом:

if form.is_valid():
    project = form.save()
    next = 'project_new_step2'
    if project.requires_swedish_setup():
        next = 'project_new_se'
    next_url = reverse(next, kwargs={'project_id': project.id})
    return HttpResponseRedirect(next_url)

Некоторые примечания:

  • Я предполагаю, что у объектов Locale и Category есть поля name (если нет, используйте любое поле, содержащее имя, которое вы тестируете).

  • Этоне очень хорошая идея читать данные формы из request.POST (виджеты не имели возможности работать и не были проверены): лучше использовать form.cleaned_data.

  • В этом случае вам не нужно звонить request.build_absolute_uri: вполне нормально подать результат reverse непосредственно в HttpResponseRedirect.

  • "All" or "Sweden" in kwargs['locale'], вероятноне то, что вы имеете в виду: он анализирует как "All" or ("Sweden" in kwargs['locale']) и так всегда верно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...