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
的子类)。
我强烈建议重命名您的类:
- a model 通常有 no
Model
后缀,所以可以保留这个 Task
(单数) ;
- a 形式可以使用
Form
后缀,所以TaskForm
;和
- 您的视图可以重命名为
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
中添加表单的操作
我在 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
的子类)。
我强烈建议重命名您的类:
- a model 通常有 no
Model
后缀,所以可以保留这个Task
(单数) ; - a 形式可以使用
Form
后缀,所以TaskForm
;和 - 您的视图可以重命名为
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
中添加表单的操作