Django формы для виджета
Я работаю над ручной формой для создания сообщения для форумов, я не могу заставить работать категории для разных форумов.
Мой forms.py
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ["title", "content", "categories", "tags"]
def __init__(self, *args, **kwargs):
super(PostForm, self).__init__(*args, **kwargs)
self.fields['categories'].widget.attrs['readonly'] = True
Вот мой views.py
def posts(request, slug):
category = get_object_or_404(Category, slug=slug)
posts = Post.objects.filter(approved=True, categories=category)
context = {
'posts': posts,
'forum': category,
'title': 'Posts'
}
return render(request, 'forums/posts.html', context)
@login_required
def create_post(request):
context = {}
form = PostForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
print("\n\n form is valid")
author = Author.objects.get(user=request.user)
new_post = form.save(commit=False)
new_post.user = author
new_post.save()
form.save_m2m()
return redirect('forums')
context.update({
'form': form,
'title': 'Create New Post'
})
return render(request, 'forums/create_post.html', context)
И напоследок мой html для создания поста
<form method="POST" action="." enctype="multipart/form-data">
{% csrf_token %}
<div class="mb-4">
<label for="{{ form.categories.id_for_label }}" class="form-label">{{ form.categories.label }}:</label>
<input class="input is-medium"
name="{{ form.categories.html_name }}"
type="text" class="form-control"
id="{{ form.categories.id_for_label }}"
value="{{ request.forum }}"readonly>
</div>
</form>
Если я использую форму django build inn, все работает, но я хотел использовать собственную форму, чтобы она выглядела немного лучше и могла быть размещена вокруг. Так что если кто-нибудь знает способ получить доступ к форуму и иметь возможность установить значение для категорий, я буду очень признателен
Я думаю, вам стоит взглянуть на this для большего контроля над стилизацией формы, но если это не дает вам достаточного контроля над html, вам нужно сделать что-то вроде следующего в вашем представлении и html:
Сначала нужно убедиться, что категория, которую вы хотите установить в качестве начального значения, доступна либо в форме, либо в контексте.
@login_required
def create_post(request, slug):
context = {}
category = get_object_or_404(Category, slug=slug)
context.update({'category': category})
form = PostForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
print("\n\n form is valid")
author = Author.objects.get(user=request.user)
new_post = form.save(commit=False)
new_post.user = author
new_post.save()
form.save_m2m()
return redirect('forums')
context.update({
'form': form,
'title': 'Create New Post'
})
return render(request, 'forums/create_post.html', context)
Затем в html установите первичный ключ категории в поле ввода
<form method="POST" action="." enctype="multipart/form-data">
{% csrf_token %}
<div class="mb-4">
<label for="{{ form.categories.id_for_label }}" class="form-label">{{ form.categories.label }}:</label>
<input class="input is-medium"
name="{{ form.categories.html_name }}"
type="text" class="form-control"
id="{{ form.categories.id_for_label }}"
value="{{ category.pk }}"readonly>
</div>
</form>
Мне кажется, что это очень накладно, и лично я не стал бы реализовывать это таким образом. Я бы очень рекомендовал посмотреть ссылку, которой я поделился в верхней части этого ответа.