Как представить эти два уровня глубоких отношений в Django Admin? - PullRequest
0 голосов
/ 11 сентября 2018

Сценарий такой,

У меня есть три модели:

Category, Subcategory and Posts

и отношение между ними таково.

class Category(models.Model):
    cat=models.CharField(max_length=10)

    def __str__(self):
         return self.cat

class Subcategory(models.Model):
    cat=models.ForeignKey(Category,on_delete=models.CASCADE,null=True)
    subcat=models.CharField(max_length=10)

    def __str__(self):
         return self.subcat

class Posts(models.Model):
     title=models.CharField(max_length=15)
     subcat=models.ForeignKey(Subcategory,on_delete=models.CASCADE,null=True)
     def __str__(self): 
         return self.title

Все хорошо. Я добавил категории из панели администратора, а также добавил и связал подкатегории с категориями. Я, однако, хочу добавить сообщения из админ-панели тоже. Теперь проблема в том, что, когда я добавляю сообщение из панели администратора и выбираю подкатегории, в нем перечисляются все подкатегории из всех категорий (что очевидно, поскольку у меня есть поле подкатегории в модели поста). Я не хочу этого поведения, я хочу получить подкатегории только из определенной категории при сохранении.

Например: у меня есть категория Django и ее подкатегории ORM, VIEWS. Плюс у меня есть дополнительные подкатегории из других категорий, скажем, C ++. Итак, если я публикую пост, и я хочу, чтобы он пришел из категории Django, он должен указывать только ORM и VIEWS в предложении в панели администратора.

Я открыт для внесения изменений в модели, например, если требуется дополнительное поле или что-то подобное. Любые лиды приветствуются.

1 Ответ

0 голосов
/ 11 сентября 2018

Как вы выбираете категорию, из которой каждая запись будет собирать подкатегории для выбора? Модель Posts не имеет поля, относящегося к Category.

Если логика выбора категории обслуживания внешняя для каждой записи Posts, вы можете использовать этот фрагмент для достижения этой цели (с здесь )

@admin.register(Posts)
class PostsAdmin(admin.ModelAdmin):
    # (...)
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "subcat":
            kwargs["queryset"] = Subcategory.objects.filter(cat__cat=['Django'])
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

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

class Posts(models.Model):
    title=models.CharField(max_length=15)
    cat=models.ForeignKey(Category,on_delete=models.CASCADE,null=True)
    subcat=models.ForeignKey(Subcategory,on_delete=models.CASCADE,null=True)
    def __str__(self): 
        return self.title

Затем вы можете отфильтровать набор запросов que, используя пользовательскую форму (с здесь ):

class PostsAdminForm(forms.ModelForm):
    class Meta:
        model = Posts

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # use the following for python 2 instead
        # super(PostsAdminForm, self).__init__(*args, **kwargs)
        self.fields['subcat'].queryset = Subcategory.objects.filter(
            cat__id=self.instance.cat.id)

@admin.register(Posts)
class PostsAdmin(admin.ModelAdmin):
    # (...)
    form = PostsAdminForm
...