1

我正在尝试创建一个页面,用户可以在其中输入与多个模型相对应的各种数据,并可以选择动态添加其他表单。我一直在尝试为此使用 htmx 并且能够动态添加表单,但是当我保存它时,它只是保存的最后输入的表单。我没有使用表单集,因为它不能很好地与 htmx https://justdjango.com/blog/dynamic-forms-in-django-htmx#django-formsets-vs-htmx集成。

任何关于如何保存所有动态创建的表单的建议下方的代码将不胜感激!

模型.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)

表格.py

from django import forms
from .models import Book, Author
from crispy_forms.helper import FormHelper


class AuthorForm(forms.ModelForm):
    class Meta:
        model = Author
        fields = ['name']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_id = 'id-CaseForm'
        self.helper.form_class = 'blueForms'
        self.helper.form_method = 'post'
        self.helper.form_tag = False

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ('title',)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.form_tag = False
        self.helper.form_show_labels = False

视图.py

class create_book(TemplateView):
    
    template_name = 'create_book.html'

    def get(self, *args, **kwargs):
        author_form = AuthorForm
        book_form = BookForm
        return self.render_to_response(
            {'book_form': BookForm,
             "author_form": AuthorForm,}
        )
    def post(self, *args, **kwargs):
        author_form = AuthorForm(data=self.request.POST)
        book_form = BookForm(data=self.request.POST)
        if author_form.is_valid():
            author = author_form.save()
            if book_form.is_valid():
                book = book_form.save(commit=False)
                book.author = author
                book.save()

def create_book_form(request):
    form = BookForm()
    context = {
        "form": form
    }
    return render(request, "partials/book_form.html", context)

网址.py

urlpatterns = [
    path('create_book/', create_book.as_view(), name='create-book'),
    path('htmx/create-book-form/', create_book_form, name='create-book-form'),]

create_book.html

{% extends "base.html" %}
{% block content %}
{% load crispy_forms_tags %}

<form  class="blueForms" id="id-CaseForm" method="post" >
{% crispy author_form %}

{% crispy book_form %}
<button type="button" hx-get="{% url 'create-book-form' %}" hx-target="#bookforms" hx-swap="beforeend">
    Add book form
</button>
<div id="bookforms"></div>
</form>

部分/book_form.html

{% load crispy_forms_tags %}

<div hx-target="this" hx-swap="outerHTML">

{% csrf_token %}
{% crispy form %}
{{ form.management_form }}

</div>
4

1 回答 1

0

一个快速的谷歌找到我这个模块:

https://github.com/adamchainz/django-htmx

我的朋友,似乎有人可能已经为你做了这个:)

于 2022-01-21T09:41:42.837 回答