Как создать выпадающее меню из модели в Django - PullRequest
0 голосов
/ 29 мая 2018

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

Я немного запутался относительно того, что я должен включить в свои формы и как вызывать эту форму вmy base.html.

base.html

...
<body>
        <div class="page-header">
            {% if user.is_authenticated %}
            <a href="{% url 'logout' %}" class="top-menu"><button type="button" class="btn btn-danger">Logout</button></a>
            <a href="{% url 'logout' %}" class="top-menu"><button type="button" class="btn btn-default">Account</button></a>
            <a href="{% url 'post_new' %}" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
            {% endif %}


            {% if user.is_anonymous %}
            <a href="{% url 'signup' %}" class="top-menu"><button type="button" class="btn btn-success">Sign-Up</button></a>
            <a href="{% url 'login' %}" class="top-menu"><button type="button" class="btn btn-primary">Login</button></a>
            {% endif %}

        <div class="fieldWrapper">
            <label for="{{ category_form.category.id_for_label }}">Select a category:</label>
            {{ category_form.category }}
        </div>

views.py:

from .forms import PostForm


def category_dropdown(request):
    return render (request, 'quickblog/base.html')

models.py

...
# Categorys of Post Model
class Category(models.Model):
    title = models.CharField(max_length=255, verbose_name="Title")
    description = models.TextField(max_length=1000, null=True)
    categorycover = fields.ImageField(upload_to='categorycovers/', blank=True, null=True, dependencies=[
        FileDependency(processor=ImageProcessor(
            format='JPEG', scale={'max_width': 600, 'max_height': 600}))
    ])

    class Meta:
        verbose_name = "Category"
        verbose_name_plural = "Categories"
        ordering = ['title']

    def __str__(self):
        return self.title

#Post Model
class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField(max_length=10000)
    category = models.ForeignKey(Category, verbose_name="Category", on_delete=models.CASCADE, null=True)
    tag = models.CharField(max_length=50, blank=True)
...

forms.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'text', 'category', 'tag', 'postcover', 'postattachment',]
    captcha = CaptchaField()

settings.py

...
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'quickblog.quickblog.context_processors.category_form',
)
...

context_processor.py

from .forms import PostForm

def category_form(request):
    form = PostForm()
    return {'category_form': form}

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете нам что-то вроде этого:

Forms.py :

    class MyModel2(forms.Form):
         color = forms.CharField(widget=forms.Select)

Index.html :

<form method="POST" action = "ACTION_OR_VIEW_URL_ON_SUBMIT_HERE">{% csrf_token %}
    <label for="colorSelect">Choose color</label>
    <select type="text" id="colorSelect" name="colorSelect">
        <option selected>GREEN</option>
        <option>BLUE</option>
        <option>RED</option>
        <option>ORANGE</option>
        <option>BLACK</option>
    </select>
    <br><br>
    <input type="submit" value="Submit!"/>
</form>
0 голосов
/ 30 мая 2018

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

. В вашем файле настроек, под шаблонами context_processors добавьте что-то вроде `your_project.your_app.context_processors.category_form '

И в вашем приложении (я полагаю, что это быстрый блог) добавьте файл:

context_processors.py

from .forms import PostForm

def category_form(request):
    form = PostForm()
    return {'category_form': form}

Кстати, чтобы воспроизвести ваш текущийВ коде мне пришлось внести несколько изменений.

В views.py я изменил categories = Category.objects.title() на categories = Category.objects.only('title')

, а затем избавился от этого и просто использовал вместо этого форму

from .forms import PostForm
def category_dropdown(request):
    form = PostForm()
    return render(request, 'quickblog/base.html', {'form': form})

И, наконец,

def category_dropdown(request):
    return render (request, 'quickblog/base.html')

, так как теперь работает context_processor.


Я полагаю, что в вашем комментарии вы спрашиваете, как вы делаете толькопадать.

В вашем шаблоне вы бы сделали что-то вроде этого:

<div class="fieldWrapper">
    <label for="{{ category_form.category.id_for_label }}">Select a category:</label>
    {{ category_form.category }}
</div>

Пожалуйста, смотрите Документы Django по теме для более подробной информации.


Файлы, которые я использовал, чтобы он работал

models.py

from django.db import models

# Categorys of Post Model
class Category(models.Model):
    title = models.CharField(max_length=255, verbose_name="Title")
    description = models.TextField(max_length=10000, null=True)

    class Meta:
        verbose_name = "Category"
        verbose_name_plural = "Categories"
        ordering = ['title']

    def __str__(self):
        return self.title

#Post Model
class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField(max_length=10000)
    category = models.ForeignKey(Category, verbose_name="Category", on_delete=models.CASCADE, null=True)

forms.py

from django import forms
from .models import Post
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'text', 'category']

settings.py

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'django_settings_export.settings_export',
                'quickblog.context_processors.category_form'
            ],
        },
    },
]
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...