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>

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

Вернуться на верх