简体   繁体   中英

How can i use more different forms in the same Django template?

In my project, i have a template where i'm trying to put two forms for different use cases. I've never come across this problem before, so i don't really know where to go from here to use two forms in the same page.

At first i thought of creating another view to handle each form, but i think that this solution would create problems with the rendering of my templates, other than not being sustainable if i should have this problem again with another template.

After making some research, i found a solution but it works for class based views, but i'd like to avoid that since my view is already a function based view, and i would have to make a lot of changes in my code.

Would it be possible to solve this problem with a function based view? Every advice is appreciated

First field

class FirstForm(forms.ModelForm):

    firstfield = forms.CharField() 
    secondfield = forms.CharField()
    class Meta:
        model = MyModel
        fields = ("firstfield", "secondfield")
    def save(self, commit=True):
        send = super(FirstForm, self).save(commit=False)
        if commit:
            send.save()
        return send**

Second Form

class SecondForm(forms.ModelForm):

    firstfield = forms.FloatField() 
    secondfield = forms.Floatfield()
    thirdfield = forms.CharField()

    class Meta:
        model = MyModelTwo
        fields = ("firstfield", "secondfield", "thirdfield")

    def save(self, commit=True):
        send = super(SecondForm, self).save(commit=False)
        if commit:
            send.save()
        return send

Template

  <h3> First Form </h3>
  <form method="post" novalidate>
      {% csrf_token %}
      {% include 'main/includes/bs4_form.html' with form=form %}
      <button type="submit" class="btn btn-danger" style="background-color: red;">SUBMIT</button>
  </form>

  <h3> Second Form </h3>
  <form method="post" novalidate>
      {% csrf_token %}
      {% include 'main/includes/bs4_form.html' with form=form %}
      <button type="submit" class="btn btn-danger" style="background-color: red;">SUBMIT</button>
  </form>

EDIT: my view:

def myview(request):

    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = FirstForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            send = form.save()
            send.save()
            messages.success(request, f"Success")

    # if a GET (or any other method) we'll create a blank form
    else:
        form = FirstForm()

    return render(request,
                  "main/mytemplate.html",
                  context={"form":form})

This answer is a bit general because you haven't included your view function. You can add each of these forms to your view's context. Something like this:

views.py

...
from .forms import FirstForm, SecondForm
...

def some_view(request):

    context = {
        'first_form': FirstForm(request.POST or None),
        'second_form': SecondForm(request.POST or None)
    }
    return render(request, "app/some_template.html", context)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM