Django,Modelform无法呈现

时间:2019-07-12 10:16:53

标签: python django render modelform

我用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})

除了看到两个文本字段外,我只看到“执行”按钮

2 个答案:

答案 0 :(得分:2)

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

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

class Tasks(View):

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

因此,您在这里只需创建一个新的Tasks对象(该对象是View的子类)。

强烈建议重命名您的班级:

  1. 模型通常没有 Model后缀,因此您可以保留此Task(单数);
  2. 一个 form 可以使用Form后缀,因此TaskForm;和
  3. 您的视图可以重命名为TaskView

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

class TaskView(View):

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

但是,这里看起来您基本上实现了CreateView [Django-doc],例如:

from django.urls import reverse_lazy
from django.views.generic.edit import CreateView

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

对于GET请求,这将在上下文中使用form呈现模板。它将同时执行POST请求,该请求将创建模型对象并将其保存到数据库,然后重定向到 certain-view 。因此它将为您实现很多样板代码。

答案 1 :(得分:1)

更改表格。py

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

在应用urls.py中添加url

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})

别忘了在task.html中添加表单操作