доступ к подкатегориям продуктов, таких как Ebay в django форме - PullRequest
2 голосов
/ 26 апреля 2020

Я пытаюсь повторить сайты структуры категорий, которые использует Ebay при публикации продукта. Например, если вы хотите опубликовать Iphone для продажи, вы go разместите объявление, выберите категорию в раскрывающемся меню на форме («электроника и компьютеры»), а затем выберите подкатегорию «телефоны». ", то последняя подкатегория" iphone ". Для создания этой структуры я использую django -категории. Создавая продукт в рабочем файле страницы администратора, форма администратора позволяет мне выбирать из выпадающего меню каждой категории, однако я не могу повторить этот процесс в своей форме, чтобы дать пользователям возможность выбирать из много категорий.

Если вы не знаете, если django -категории, это модифицированный обход дерева предзаказа.

Вот моя модель объявления

class Advert(models.Model):

    title = models.CharField(max_length=100, blank=False, null=False)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL)
    image = models.ImageField(upload_to='media/', blank=True, null=True)  
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    quantity = models.IntegerField(blank=False, null=False)
    condition = models.CharField(max_length=10, choices=COND_CATEGORIES, blank=False, null=False)
    price = models.DecimalField(decimal_places=2, max_digits=14, blank=False, null=False)
    description = models.TextField(blank=False, null=False)
    date_posted = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)
    featured = models.BooleanField(default=False)
    search_vector = SearchVectorField(null=True, blank=True)

Вот модель категории

class Category(CategoryBase):


    class Meta:
        verbose_name_plural = 'categories'

И здесь я в форме, которая позволяет пользователям размещать рекламу

class PostAdvertForm(forms.ModelForm):

    title = forms.CharField(label='Ad Title', required=True)
    category = forms.ChoiceField(choices=Advert.category, label='Choose a category', required=True)
    price = forms.DecimalField(label='Price', required=True, widget=forms.TextInput())                                  
    description = forms.CharField(widget=forms.Textarea(attrs={'placeholder':
                                          ('Please provide a detailed description'),
                                          'autofocus': 'autofocus'}), label='Description', required=True)
    condition = forms.ChoiceField(choices=Advert.COND_CATEGORIES, label='Condition', required=True)
    quantity = forms.IntegerField(label='Quantity', required=True, widget=forms.TextInput())
    image = forms.ImageField(label='Upload an image', required=False)
    class Meta:
        model = Advert
        fields = (
            'title', 'category', 'quantity', 'condition', 'price', 'description', 
            'image')

Использование advert.category в поле выбора не работает из-за того, что «объект ForwardManyToOneDescriptor« не повторяется » ,

Мой вопрос: как я могу отобразить список категорий в поле выбора?

РЕДАКТИРОВАТЬ: Было просто интересно, возможно ли это реализовать полностью с jquery на передней панели и просто отправить через выбранную категорию через очищенные данные? Таким образом, мне даже не нужно было бы использовать django -категории на бэкэнде, я мог бы просто хранить огромное количество категорий.

2-е РЕДАКТИРОВАНИЕ:

Похоже, я получил первую часть этого, я вставил новый код формы ниже:

at = Advert.category.get_queryset()


class PostAdvertForm(forms.ModelForm):

    title = forms.CharField(label='Ad Title', required=True)
    category = forms.ModelChoiceField(queryset=cat, label='Choose a category', required=True)
    price = forms.DecimalField(label='Price', required=True, widget=forms.TextInput())                                  
    description = forms.CharField(widget=forms.Textarea(attrs={'placeholder':
                                          ('Please provide a detailed description'),
                                          'autofocus': 'autofocus'}), label='Description', required=True)
    condition = forms.ChoiceField(choices=Advert.COND_CATEGORIES, label='Condition', required=True)
    quantity = forms.IntegerField(label='Quantity', required=True, widget=forms.TextInput())
    image = forms.ImageField(label='Upload an image', required=False)
    class Meta:
        model = Advert
        fields = (
            'title', 'category', 'quantity', 'condition', 'price', 'description', 
            'image')

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

1 Ответ

0 голосов
/ 26 апреля 2020

Определить функцию update_form_field_choices (например, в utils.py):

def update_form_field_choices(field, choices):
    """
    Update both field.choices and field.widget.choices to the same value (list of choices).
    """
    field.choices = choices
    field.widget.choices = choices

Затем определить метод __init__ в PostAdvertForm:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

И в эту функцию, вызовите эту функцию и замените your_choices() на функцию, которая возвращает правильный выбор. Запомните формат выбора (кортеж кортежей).

    update_form_field_choices(field=self.fields['category'], choices=your_choices())

Также помните, ModelForm определяет поля формы для вас, поэтому вам не нужно определять их явно, если вы не хотите что-то изменить в определении по умолчанию.

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