1. ivanff.myopenid.com

    23.07.2010

    0 ↑
    0 ↓
    на 1.1 и 1.2.0 прекрастно работал сл. код:
    def create_profile(sender, instance, created, **kwargs):
    if created:
    instance.profile.create()
    post_save.connect(create_profile, sender=User)
    вываливает ошибку
    Django Version: 1.2.1
    Exception Type: TypeError
    Exception Value:

    save() got an unexpected keyword argument 'using'

    Exception Location: /usr/lib/python2.5/site-packages/django/db/models/query.py in create, line 352

    смотрим:
     346.  """
    347. Creates a new object with the given kwargs, saving it to the database
    348. and returning the created object.
    349. """
    350. obj = self.model(**kwargs)
    351. self._for_write = True

    352. obj.save(force_insert=True, using=self.db) ...

    353. return obj
    видим что к save добавился еще 1 аргумент. Пробовал его коментировать все заработало, вот собственно вопрос: ЧТО ТАКОЕ!!!???

    Кстати вот так работает
    profile = ProfileModel(user=instance)
    profile.save()
    НО ЭТОЖ НЕ КРАСИВО!!!
  2. Alexander Koval

    23.07.2010

    0 ↑
    0 ↓
    Возможно в модели переопределен метод save. Нужно переопределять так:
    def save(self, *args, **kwargs):
    ...
    super(YourModel, self).save(*args, **kwargs)
    ...
  3. Alexander Koval

    23.07.2010

    0 ↑
    0 ↓
    И кстати в 1.2.0 по идее тоже не должно было работать, именно в этой версии и появился using.
  4. admin

    23.07.2010

    0 ↑
    0 ↓

    похоже, что в ProfileModel переопределен метод save. как-то так:

    def save(self, force_insert=True):

    нужно обновить сигнатуру или сделать финт ушами:

    def save(self, force_insert=True, **kwargs):

  5. ivanff.myopenid.com, пожалуйста не надо ногой shift зажимать!

  6. ivanff.myopenid.com

    26.07.2010

    0 ↑
    0 ↓
    Да... чагот я тупанул :( всем пасибо.
  7. ivanff.myopenid.com

    26.07.2010

    0 ↑
    0 ↓
    Вот еще может туплю, но:

    переделал я save на
    def save(self, force_insert=False, force_update=False, **kwargs):
    ....
    super(ProfileModel, self).save(force_insert=force_insert, force_update=force_update, **kwargs)
    При этом код post_save() заработал (старенький)
    def create_profile(sender, instance, created, **kwargs):
    if created:
    instance.profile.create()
    post_save.connect(create_profile, sender=User)
    но вот во вьюхе теперь сломалась такая штуковина:
        form1 = UserFrom()
    form2 = ProfileForm()

    next = request.GET.get('next', '/')
    if request.method == 'POST':
    form1 = UserFrom(request.POST)
    if form1.is_valid():
    user = form1.save(commit=False)
    form2 = ProfileForm(data=request.POST, files=request.FILES)
    if form2.is_valid():
    user.save()
    form2.instance = user.get_profile()
    form2.save(commit=True)
    user = authenticate(username=form1.cleaned_data['username'], password=form1.cleaned_data['password2'])
    login(request, user)
    Самое интереснео в том что ошибок не выдает, и профиль к пользователю создается, только пустой. Данные из формы form2 не сохраняются в профиль, а куда то пропадают...
    По старому работало с django 1.1, 1.2, пришлось колхозить вот так:
        form1 = UserFrom()
    form2 = ProfileForm()

    next = request.GET.get('next', '/')
    if request.method == 'POST':
    form1 = UserFrom(request.POST)
    if form1.is_valid():
    user = form1.save(commit=False)
    form2 = ProfileForm(data=request.POST, files=request.FILES)
    if form2.is_valid():
    user.save()
    form2_ = ProfileForm(data=request.POST, files=request.FILES, instance=user.get_profile())
    if form2_.is_valid():
    form2_.save(commit=True)
    #form2.instance = user.get_profile()
    #form2.save(commit=True)
    user = authenticate(username=form1.cleaned_data['username'], password=form1.cleaned_data['password2'])
    login(request, user)
    Кто объяснит что не так?
    ps: Бум смотреть что еще сломалось ...
  8. Что значит "куда-то потерялись"? Так не бывает, смотрите внутрь в код.

    В save формы они есть? А в save модели? Я бы еще посмотрел, может быть, в save бывают позиционные аргументы.

  9. ivanff.myopenid.com

    26.07.2010

    0 ↑
    0 ↓
    САМ офигеваю, в form2.data они есть, после form2.save(commit=True) их нет, то есть та запись для которой они заполнялись так и осталась пустая.
    есть подозрение что в новой джанге form2.instance = Объект модели, не просто дополняет данный формы как в 1.1, а заменяет их... пришлось опять костылить:
    form2 = ProfileForm(data=request.POST, files=request.FILES)
    if form2.is_valid():
    user.save()
    form2_ = ProfileForm(data=request.POST, files=request.FILES, instance=user.get_profile())
    if form2_.is_valid():
    form2_.save(commit=True)
    #form2.instance = user.get_profile()
    #form2.save(commit=True)
    user = authenticate(username=form1.cleaned_data['username'], password=form1.cleaned_data['password2'])
    login(request, user)
    вот так работает...
  10. razum2um

    27.07.2010

    0 ↑
    0 ↓
    Да. Точно так оно и работает...
    Если данные формы свежее - сохраняем модель, в _конструкторе_ формы задаем instance, сохраняем форму

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.