Как я фильтрую выбор ForeignKey в Django ModelForm?

Используя простой объект, можно разделить на пары строки, которые представляют имена свойства с их соответствующими значениями. Изменение цвета фона и создание более смелого текста, например, были бы похожи на это:

$("#message").css({
    "background-color": "#0F0", 
    "font-weight"     : "bolder"
});

, С другой стороны, можно использовать имена свойства JavaScript также:

$("#message").css({
    backgroundColor: "rgb(128, 115, 94)",
    fontWeight     : "700"
});

[еще 115] информация может быть найдена в документация jQuery .

218
задан Tom 14 November 2008 в 15:21
поделиться

2 ответа

В дополнение к ответу С.Лотта и, как указано в комментариях, можно добавить фильтры набора запросов, переопределив функцию ModelForm .__ init __ . (Это можно легко применить к обычным формам), это может помочь при повторном использовании и сохранить аккуратность функции просмотра.

class ClientForm(forms.ModelForm):
    def __init__(self,company,*args,**kwargs):
        super (ClientForm,self ).__init__(*args,**kwargs) # populates the post
        self.fields['rate'].queryset = Rate.objects.filter(company=company)
        self.fields['client'].queryset = Client.objects.filter(company=company)

    class Meta:
        model = Client

def addclient(request, company_id):
        the_company = get_object_or_404(Company, id=company_id)

        if request.POST:
            form = ClientForm(the_company,request.POST)  #<-- Note the extra arg
            if form.is_valid():
                form.save()
                return HttpResponseRedirect(the_company.get_clients_url())
        else:
            form = ClientForm(the_company)

        return render_to_response('addclient.html', 
                                  {'form': form, 'the_company':the_company})

Это может быть полезно для повторного использования, например, если у вас есть общие фильтры, необходимые для многих моделей (обычно я объявляю абстрактный класс формы). Например,

class UberClientForm(ClientForm):
    class Meta:
        model = UberClient

def view(request):
    ...
    form = UberClientForm(company)
    ...

#or even extend the existing custom init
class PITAClient(ClientForm):
    def __init__(company, *args, **args):
        super (PITAClient,self ).__init__(company,*args,**kwargs)
        self.fields['support_staff'].queryset = User.objects.exclude(user='michael')

В остальном я просто пересказываю материалы блога Django, из которых есть много хороших.

129
ответ дан 23 November 2019 в 04:11
поделиться

Итак, я действительно пытался понять это, но похоже, что Django все еще не делает это очень простым. Я не такой тупой, но я просто не вижу никакого (несколько) простого решения.

Я считаю, что в целом довольно уродливо переопределять представления администратора для такого рода вещей, и каждый пример, который я нахожу, никогда не полностью применимо к представлениям администратора.

Это настолько обычное явление в моделях, которые я делаю, что я считаю ужасным отсутствие очевидного решения для этого ...

У меня есть следующие классы:

# models.py
class Company(models.Model):
    # ...
class Contract(models.Model):
    company = models.ForeignKey(Company)
    locations = models.ManyToManyField('Location')
class Location(models.Model):
    company = models.ForeignKey(Company)

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

Короче говоря, Мне бы потребовались некоторые параметры администратора, чтобы сделать что-то вроде этого:

# admin.py
class LocationInline(admin.TabularInline):
    model = Location
class ContractInline(admin.TabularInline):
    model = Contract
class CompanyAdmin(admin.ModelAdmin):
    inlines = (ContractInline, LocationInline)
    inline_filter = dict(Location__company='self')

В конечном счете, мне было бы все равно, был ли процесс фильтрации помещен в базовый CompanyAdmin или в ContractInline. (Размещение его во встроенном элементе имеет больше смысла, но из-за этого сложно ссылаться на базовый контракт как на «себя».)

Есть ли кто-нибудь, кто знает что-то настолько простое, как этот крайне необходимый ярлык? Когда я делал PHP-администраторов для такого рода вещей, это считалось базовой функциональностью! Фактически, он всегда был автоматическим, и его приходилось отключать, если вы действительно этого не хотели!

но из-за этого трудно ссылаться на базовый Контракт как на «себя».)

Есть ли кто-нибудь, кто знает что-нибудь столь же простое, как этот столь необходимый ярлык? Когда я делал PHP-администраторов для такого рода вещей, это считалось базовой функциональностью! Фактически, это всегда было автоматическим, и его приходилось отключать, если вы действительно этого не хотели!

но из-за этого трудно ссылаться на базовый Контракт как на «себя».)

Есть ли кто-нибудь, кто знает что-нибудь столь же простое, как этот столь необходимый ярлык? Когда я делал PHP-администраторов для такого рода вещей, это считалось базовой функциональностью! Фактически, это всегда было автоматическим, и его приходилось отключать, если вы действительно этого не хотели!

2
ответ дан 23 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: