Django,Modelform不渲染

Django, Modelform not rendering

我在 django 中创建了一个基本的 Modelform,但我的表单没有呈现。

tasks.html

<table class="...">
        <tr>
            <th>Function</th>
        </tr>
        <tr>
            <td>
                <form method="POST">
                    {% csrf_token %}
                    {{ form }}
                    <button type="submit">Execute</button>
                </form>
            </td>
        </tr>
</table>

models.py

class Tasks(models.Model):

    #Task module 

    function_name = models.CharField(max_length=30, default='')
    script_location = models.CharField(max_length=300, default='')

forms.py

from django.forms import ModelForm

from .models import Tasks

class Tasks(ModelForm):

    class Meta:
        model = Tasks
        fields = ['function_name','script_location']

views.py

class Tasks(View):

    def get(self, request):
        form = Tasks()
        return render(request, '.../tasks.html', {'form': form})

我除了看到两个文本字段,但我只看到 'Execute' 按钮

简答:避免名称冲突。为您的表单和视图添加后缀。

您将模型表单Tasks视图命名为Tasks Tasks。在这里,您视图中的 Tasks() 调用将解析为该视图,因此确实:

class <b>Tasks</b>(View):

    def get(self, request):
        form = <b>Tasks</b>()
        return render(request, '.../tasks.html', {'form': form})

因此您只需创建一个新的 Tasks 对象(View 的子类)。

强烈建议重命名您的类:

  1. a model 通常有 no Model 后缀,所以可以保留这个 Task (单数) ;
  2. a 形式可以使用Form后缀,所以TaskForm;和
  3. 您的视图可以重命名为 TaskView

重命名后,您可以将视图重写为:

class <b>TaskView</b>(View):

    def get(self, request):
        form = <b>TaskForm</b>()
        return render(request, '.../tasks.html', {'form': form})

然而,在这里,您基本上实现了一个 CreateView [Django-doc],例如:

from django.urls import reverse_lazy
from django.views.generic.edit import <b>CreateView</b>

class TaskView(<b>CreateView</b>):
    model = Task
    fields = ('function_name','script_location')
    template_name = '.../tasks.html'
    success_url = reverse_lazy(<i>'certain-view'</i>)

这将针对 GET 请求在上下文中呈现带有 form 的模板。它还将执行一个 POST 请求,该请求将创建一个模型对象并将其保存到数据库,然后重定向到 certain-view。所以它会为你实现很多样板代码。

改变你的forms.py

from django.forms import ModelForm
from .models import Tasks
class TasksForms(ModelForm):
    class Meta:
        model = Tasks
        fields = ('function_name','script_location',)

在您的应用中添加 url urls.py

path('your_url/', views.TaskView, name='task'),

改变你的views.py

def TaskView(request) :

    def get(self, request):
        form = TasksForms()
        return render(request, '.../tasks.html', {'form': form})

不要忘记在 tasks.html

中添加表单的操作