Найти - Пользователи
Полная версия: Внешний ключ и form_for_instance
Начало » Django » Внешний ключ и form_for_instance
1
jan2ary
Добрый всем день.
Есть модель 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)
Александр Кошелев
У меня так:
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 ) } )

и ничего не надо подменять
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB