Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » сделать нестандартый переход в Model Form [RSS Feed]

#1 Апрель 28, 2014 00:04:28

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

сделать нестандартый переход в Model Form

После выполнения update не выполняется переход на два уровня ниже, а выполняется стандарный переход на “../” (то есть от url отрезается только число)

class MyModel(models.Model):
ex_user_profile = models.ForeignKey(ExUserProfile)
...

def get_absolute_url(self):
# return reverse('user_detail')
return reverse_lazy('user_detail')

class MyFormUpdate(generic.UpdateView):
model = MyModel
fields = [ ... ]
success_url = '../../'

Офлайн

#2 Апрель 28, 2014 12:12:44

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

сделать нестандартый переход в Model Form

судя по исходникам

  
  def get_success_url(self):
        """
        Returns the supplied URL.
        """
        if self.success_url:
            url = self.success_url % self.object.__dict__
        else:
            try:
                url = self.object.get_absolute_url()
            except AttributeError:
                raise ImproperlyConfigured(
                    "No URL to redirect to.  Either provide a url or define"
                    " a get_absolute_url method on the Model.")
        return url
либо перекрывем метод, либо success_url должен иметь вид форматированой строчки в любом случае так как вы пишите не правильно

Отредактировано PanovSergey (Апрель 28, 2014 12:13:07)

Офлайн

#3 Апрель 28, 2014 13:04:08

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

сделать нестандартый переход в Model Form

url это не папки

Офлайн

#4 Апрель 28, 2014 13:04:09

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

сделать нестандартый переход в Model Form

url это не папки

Офлайн

#5 Апрель 28, 2014 13:10:35

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

сделать нестандартый переход в Model Form

PanovSergey
судя по исходникам

это я уже “всякие экспериметны ставлю” … в доках скудно, примеров с UpdateView не нашел.

Не могли бы разъяснить подробнее. Как передать форматированную строчку или что в методе переопределить.

Делаю согласно документации к django 1.6 (http://djbook.ru/rel1.6/topics/class-based-views/generic-editing.html)
class MyFormUpdate(LoginRequiredMixin,generic.UpdateView):
    model = MyModel
    success_url = reverse_lazy('user_detail')
class MyFormDelete(LoginRequiredMixin,generic.DeleteView):
    model = MyModel
    success_url = reverse_lazy('user_detail')
url(r'^profile/$', views.ExUserProfileView.as_view(), name='user_detail'),

после POST перехода в profile/, соответствующему user_detail нет.

P.S. вот все что есть в док. по этому поводу
Формы моделей(Model Forms)

Общие CBV раскрываются во всей красе при работе с моделями. Они автоматически создают класс ModelForm при работе с моделями:

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

Если метод get_object() возвращает объект, то будет использоваться класс этого объекта.

Если указан атрибут queryset, то будет использована модель этого запроса(queryset).

Представления форм, связанные с моделями, предоставляют реализацию метода form_valid(), которая автоматически сохраняет модель. Вы можете переопределить этот метод согласно вашим требованиям; смотрите примеры ниже.

Вы можете не устанавливать значение success_url для классов CreateView или UpdateView - они воспользуются методом get_absolute_url() объекта модели (если такой объект доступен).

Если вам необходимо специальное поведение для ModelForm (например для дополнительной валидации данных) просто установите form_class в нужное значение.

Примечание

При создании пользовательского класса формы, вы по прежнему должны указать модель. Даже в том случае если в form_class используется ModelForm.

Во-первых, мы должны добавить метод get_absolute_url() в наш класс Author :

# models.py
from django.core.urlresolvers import reverse
from django.db import models

class Author(models.Model):
name = models.CharField(max_length=200)

def get_absolute_url(self):
return reverse('author-detail', kwargs={'pk': self.pk})

Затем мы можем использовать класс CreateView и “сотоварищей” чтобы выполнить необходимую работу. Обратите внимание, что мы лишь создаем конфигурацию для CBV; нам не нужно писать никакого кода, реализующего логику:

# views.py
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author

class AuthorCreate(CreateView):
model = Author
fields =

class AuthorUpdate(UpdateView):
model = Author
fields =

class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('author-list')

Примечание

Мы должны использовать здесь функцию reverse_lazy(), а не просто reverse, поскольку urls не “загружаются” при импорте файла.

Офлайн

#6 Апрель 28, 2014 13:48:14

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

сделать нестандартый переход в Model Form

Singularity
url это не папки

при проблемах выше, в классе, в котором я переопределил get_object, “папки” работают
class ExUserProfileFormUpdate(LoginRequiredMixin,generic.UpdateView):
model = ExUserProfile
success_url = '../'
def get_object(self, queryset=None):
return ExUserProfile.objects.get( user_id = ... )
без success_url = ‘../’ и get_absolute_url ошибка “No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model.”. Но, вот это представление отличается тем, что в него я не передаю никаких цифр.

Офлайн

  • Начало
  • » Django
  • » сделать нестандартый переход в Model Form[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version