django admin - заполнить поле с возможностью вызова - PullRequest
0 голосов
/ 26 июня 2011

Я не могу найти ни одного примера того, как кто-то делает это, кроме этого примера, который не помогает мне, кроме как знать, где должен находиться код.

Как предварительно заполнить поля UserProfile в админке Django?

так вот мой код

class QuoteMaterial(models.Model):
    name = models.CharField(_('name'), max_length=255)
    content = models.TextField(_('content'),
                           help_text=_('A static priced item used when doing a job. Selectable when creating a quote. '))
    price = models.DecimalField(_('price'), max_digits=6, help_text="not sure if this is before or after VAT yet", decimal_places=2, default="0.00")

    def get_companies():
        return CompanyProfile.objects.filter(user=request.user)

    company = models.ForeignKey(CompanyProfile, default=get_companies) 

Если это не очевидно, я пытаюсь в разделе администратора заполнить раскрывающийся список доступными компаниями, которые принадлежат пользователю, вошедшему в систему.

Моя проблема в том, что я не знаю, как передать объект запроса в "get_companies". Кто-нибудь знает какие-либо примеры.

Ответы [ 2 ]

3 голосов
/ 26 июня 2011

Вы должны будете сделать это переопределение в вашем классе администратора, который расширяет ModelAdmin, а не в вашем классе, который расширяет models.Model.В частности, вам нужно переопределить formfield_for_foreignkey.

из документов :

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "car":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
    return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Для вашего случая это может выглядеть так:

if db_field.name == "company":
    kwargs['queryset'] = request.user.company_set.all()
0 голосов
/ 26 июня 2011

Вы смешиваете термины.

«Предварительное заполнение» означает заполнение поля из другого поля.Это не то, как вы фильтруете вещи для всплывающих окон администратора, так как вы на самом деле не устанавливаете поле, а просто ограничиваете выбор и позволяете пользователю устанавливать поле из них.

Дополнительно, значение default дляполе должно быть константой, так как оно передается в базу данных, которая не может использовать запрос для установки значения по умолчанию.

То, что вы действительно хотите, это что-то вроде limit_choices_to ( docs ) для вашего ForeignKey, но даже тогда вы не можете использовать request для этого;он должен работать с использованием полей в модели.Причина этого заключается в том, что если вы основываете его на пользователе, то некоторые пользователи не смогут выбрать текущее значение, установленное другим пользователем.Вы не хотите, чтобы company менялся сам, когда пользователь просто хочет изменить content, например, просто потому, что user не дает текущего company в фильтре.

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