Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 18, 2007 15:39:34

jan2ary
От:
Зарегистрирован: 2006-11-21
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Внешний ключ и form_for_instance

Добрый всем день.
Есть модель Order с несколькими полями, одно из полей - dealer - внешний ключ на модель Dealer. У дилера есть, в частности, поле email.
Для модели Order создается форма с помощью form_for_instance, поле dealer в ней отображается выпадающим списком, и все хорошо, все работает.

class Dealer(models.Model):
   name = models.CharField(maxlength=40, unique=True)
   email = models.EmailField(blank=True, null = True)
   ...
class Order(models.Model):
   ...
   # Такой limit_choices_to не фильтрует
   dealer = models.ForeignKey(Dealer, limit_choices_to = {'email__contains': '@'})
   ...
Теперь есть желание исключить дилеров, у которых email - пустое поле, но limit_choices_to не помогает, в списке по-прежнему все существующие дилеры.
Тогда в form_for_instance добавляю аргумент formfield_callback, которому отдаю функцию:
def field_callback(field, **kwargs):
    if field.name == 'dealer':
        return forms.ChoiceField(label=u'Select a Dealer', choices = field.get_choices(True), **kwargs)
    else: return field.formfield(**kwargs)
и вот только после этого срабатывает ограничение. Видимо, только здесь get_choices подхватывает limit_choices_to.
Но здесь другая проблема: после подмены поля на ChoiceField модель перестает понимать это поле как внешний ключ к дилеру, при сохранении получаю ошибку DoesNotExist.
Подскажите, в чем я не прав?

Да, python 2.5.1 (cygwin), WinXP, django (At revision 6525)



Офлайн

#2 Окт. 18, 2007 17:56:02

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Внешний ключ и form_for_instance

У меня так:

def form_for_model_with_data( model, fields, data ):
    def _field_callback( field ):
        if field.name in data:
            queryset = data[ field.name ]
            return field.formfield( queryset = queryset )
        else:
            return field.formfield()
        
    return form_for_model( model, fields = fields,  formfield_callback = _field_callback )
Form = form_for_model_with_data( Order, { 'dealer' : Dealer.objects.filter( email__isnull = False ) } )

и ничего не надо подменять



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version