我用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})
除了看到两个文本字段外,我只看到“执行”按钮
答案 0 :(得分:2)
简短答案:避免名称冲突。在您的表单和视图中添加后缀。
您命名了模型 Tasks
,表单 Tasks
和视图 Tasks
。您的视图中的Tasks()
调用将解析为该视图,因此确实如此:
class Tasks(View):
def get(self, request):
form = Tasks()
return render(request, '.../tasks.html', {'form': form})
因此,您在这里只需创建一个新的Tasks
对象(该对象是View
的子类)。
我强烈建议重命名您的班级:
Model
后缀,因此您可以保留此Task
(单数); Form
后缀,因此TaskForm
;和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中添加表单操作