Django:将多个表单合并为一个表单

eqfvzcg8  于 2023-04-07  发布在  Go
关注(0)|答案(2)|浏览(252)

我正在使用一个django(4)项目,在那里我有两个表单,并希望将它们组合成一个显示在我的模板与自定义html不是唱{{form}}语法.
下面是我的forms.py

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email']

# Create a ProfileUpdateForm to update image.
class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

如何将这两个表单合并为一个表单,以HTML格式显示所有文件并作为一个表单提交?

k97glaaz

k97glaaz1#

你可以使用html表单标签没有sumbit按钮.并保存新的数据与javascript功能 AJAX .

vohkndzv

vohkndzv2#

您可以尝试创建一个窗体,该窗体是这两个窗体的组合,然后照常显示。
因此,对于表单,类似于以下内容(在您的www.example.com中实现forms.py):

from django import forms
from django.contrib.auth.models import User
from .models import Profile

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email']

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

class CombinedForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email', 'image']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields.update(ProfileUpdateForm(*args, **kwargs).fields)

现在,您的模板看起来像这样:

<form method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <label for="{{ form.username.id_for_label }}">Username:</label>
  {{ form.username }}
  <br>
  <label for="{{ form.first_name.id_for_label }}">First name:</label>
  {{ form.first_name }}
  <br>
  <label for="{{ form.last_name.id_for_label }}">Last name:</label>
  {{ form.last_name }}
  <br>
  <label for="{{ form.email.id_for_label }}">Email:</label>
  {{ form.email }}
  <br>
  <label for="{{ form.image.id_for_label }}">Image:</label>
  {{ form.image }}
  <br>
  <input type="submit" value="Update">
</form>

然后,您的views.py将像任何正常形式一样处理它:

def profile_update(request):
    if request.method == 'POST':
        form = CombinedForm(request.POST, request.FILES, instance=request.user)
        if form.is_valid():
            form.save()
            messages.success(request, 'Your profile has been updated!')
            return redirect('profile')
    else:
        form = CombinedForm(instance=request.user)
    context = {'form': form}
    return render(request, 'profile_update.html', context)

这应该会有所帮助,除非有一个特定的原因,你想保持你的形式作为2个单独的形式-在这种情况下,无论哪种方式,你可以存储的信息,因为你请,所以我不明白为什么这将是一个问题。

相关问题