Django не рендеринг полей формы - PullRequest
1 голос
/ 13 января 2020

Я смотрел на подобные вопросы, но они, кажется, не применяются. У меня очень простая форма django, которая не отображается на сайте, я вижу только кнопку «Отправить». Вот соответствующие файлы:

models.py

from django.db import models
from django.urls import reverse
import uuid

# Create your models here.
class Job(models.Model): 
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False)
    job_name = models.CharField(max_length=200)
    #One to many relationship requires on_delete
    email = models.EmailField()
    def __str__(self): 
        return self.job_name

forms.py

from django import forms
class JobForm(forms.Form):
    job_name = forms.CharField(max_length=200)
    email = forms.EmailField()

views.py

from django.shortcuts import render
from django.views.generic import TemplateView
from .forms import JobForm
from .models import Job

class HomePageView(TemplateView):
    template_name = 'index.html'

class SubmitPageView(TemplateView):
    template_name = 'submit.html'


def submit_job(request):
    # Retrieve post by id
    if request.method == 'POST':
    # Form was submitted
        form = JobForm(request.POST)
        if form.is_valid():
    #Form fields passed validation
    #If the form is valid, we retrieve the validated data accessing
    #form.cleaned_data. This attribute is a dictionary of form fields and their values.
            cd = form.cleaned_data
            my_model = Job()
            my_model.job_name = cd.get('job_name')
            my_model.email = cd.get('email')
            # Save the job to the database
            my_model.save()
    else:
        form = JobForm()
    return render(request, SubmitPageView(), {'form': form})

И в моем шаблоне у меня есть

         <form method="POST" action=".">
            <table>
            {% csrf_token %}
            {{ form.as_table }}
            </table>

, который отображается как:

          <form method="POST" action=".">
            <table>
            <input type="hidden" name="csrfmiddlewaretoken" value="I7yL9XAUhEPiriKVHKtqh9UfhsLWoJrBo68uguqMecX8gmuNoJV7gykvsPc7FtQ2">

            </table>

Ответы [ 3 ]

1 голос
/ 14 января 2020

ОК, я нашел решение, выполнив https://docs.djangoproject.com/en/3.0/topics/class-based-views/intro/ По сути, поскольку я использовал представления на основе классов, функции для получения и публикации формы должны быть включены в представление на основе классов для эта страница Вот текущая версия views.py :

from django.shortcuts import render
from django.views.generic import TemplateView
from .forms import JobForm
from .models import Job

class HomePageView(TemplateView):
    template_name = 'index.html'

class SubmitPageView(TemplateView):
    form_class = JobForm
    template_name = 'submit.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
    #Form fields passed validation
    #If the form is valid, we retrieve the validated data accessing
    #form.cleaned_data. This attribute is a dictionary of form fields and their values.
            cd = form.cleaned_data
            my_model = Job()
            my_model.job_name = cd.get('job_name')
            my_model.email = cd.get('email')
            # Save the job to the database
            my_model.save()
        else:
            form = JobForm()

        return render(request, self.template_name, {'form': form})

0 голосов
/ 13 января 2020

Имеет ли значение, если вы определили форму как modelForm и явно указали модель и поля?

Добавьте / измените следующее в своем Forms.py:

class JobForm(forms.ModelForm):
  class Meta:
    model = Job
    fields = ('job_name', 'email')
  job_name = forms....
0 голосов
/ 13 января 2020

Попробуйте код ниже:

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

    return render(request, 'submit.html', {'form': form})


<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form.as_table }}
    <input type="submit" value="Submit">
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...