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'
],
},
},
]
...