姜戈 form.save()
Django form.save()
我在 Django 中使用 CRUD 时遇到了一些问题。我无法将对象添加到数据库。
文件views.py
@login_required
def persons_add(request):
form = forms.PersonForm(request.POST)
if form.is_valid():
form.save()
return redirect('persons_list')
context = {
'form': form
}
return render(request, 'persons/persons_add.html', context)
文件form.html
<form role="form" method="POST" action="/persons/">
{% csrf_token %}
<table class="table table-bordered">
{% for field in form.visible_fields %}
<tr>
<th>
{{ field.label }}
</th>
<td>
{{ field }}
</td>
</tr>
{% endfor %}
</table>
<button type="submit" name="submit" class="btn btn-success">Add Person</button>
</form>
文件forms.py
from django import forms
from persons import models
class PersonForm (forms.ModelForm):
class Meta:
model = models.Person
fields = ['name', 'surname']
文件person_list.html
<tbody>
{% for person in persons_list %}
<tr>
<td>{{ person.name }}</td>
<td>{{ person.surname }}</td>
<td>
<a href="{{ person.id }}/edit"
<p data-placement="top" data-toggle="tooltip" title="Edit"><button class="btn btn-primary btn-xs" data-title="Edit" data-toggle="modal" data-target="#edit" ><span class="glyphicon glyphicon-pencil"></span></button></p>
</a>
</td>
<td>
<a href="{{ person.id }}/delete">
<p data-placement="top" data-toggle="tooltip" title="Delete"><button class="btn btn-danger btn-xs" data-title="Delete" data-toggle="modal" data-target="#delete" ><span class="glyphicon glyphicon-trash"></span></button></p>
</a>
</td>
</tr>
{% endfor %}
</tbody>
文件urls.py(申请)
from django.conf.urls import patterns, include, url
from django.contrib import admin
from persons import views
urlpatterns = patterns('',
#url(r'^$', views.PersonsView.as_view(), name='persons'),
url(r'^$', views.persons_list, name='persons_list'),
url(r'^add/', views.persons_add, name="persons_add"),
url(r'^(?P<person_id>\d+)/edit/$', views.persons_edit, name="persons_edit"),
url(r'^(?P<person_id>\d+)/delete/$', views.persons_delete, name="persons_delete"),
)
文件urls.py(主要项目)
from django.conf.urls import patterns, include, url
from django.contrib import admin
from hr import views
urlpatterns = patterns('',
url(r'^persons/', include('persons.urls', namespace='persons')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.index, name='index'),
url(r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'login.html'}),
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
)
错误在哪里?为什么这里没有任何作用?为什么我不能将 POST 发送到数据库并添加 Person?
首先,你的views
有错误。您需要在 GET request, and handle the form when it's POST:
上发送空表格
@login_required
def persons_add(request):
# Check if it's POST request then handle the form
if request.method == 'POST':
form = forms.PersonForm(request.POST)
if form.is_valid():
form.save()
return redirect('persons_list')
else:
# If not, you need an empty form for GET request
form = forms.PersonForm()
context = {
'form': form
}
return render(request, 'persons/persons_add.html', context)
请先更正此问题,然后我们会再次检查您的位置,一次一个步骤。
检查您的 url 路线。您目前正在向 /persons/
发帖。根据您的 url 建议更改为 /persons/add/
。
此外,您的 urls.py 主文件有误。如果你想include应用urls.py,不要和你的主路由混在一起。像这样拆分它们:
主要urls.py文件:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.index, name='index'),
url(r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'login.html'}),
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
)
# Split your app URLs and using += patterns with their views
urlpatterns += patterns(
'persons.views',
(r'^persons/', include('persons.urls', namespace='persons')),
)
我在 Django 中使用 CRUD 时遇到了一些问题。我无法将对象添加到数据库。
文件views.py
@login_required
def persons_add(request):
form = forms.PersonForm(request.POST)
if form.is_valid():
form.save()
return redirect('persons_list')
context = {
'form': form
}
return render(request, 'persons/persons_add.html', context)
文件form.html
<form role="form" method="POST" action="/persons/">
{% csrf_token %}
<table class="table table-bordered">
{% for field in form.visible_fields %}
<tr>
<th>
{{ field.label }}
</th>
<td>
{{ field }}
</td>
</tr>
{% endfor %}
</table>
<button type="submit" name="submit" class="btn btn-success">Add Person</button>
</form>
文件forms.py
from django import forms
from persons import models
class PersonForm (forms.ModelForm):
class Meta:
model = models.Person
fields = ['name', 'surname']
文件person_list.html
<tbody>
{% for person in persons_list %}
<tr>
<td>{{ person.name }}</td>
<td>{{ person.surname }}</td>
<td>
<a href="{{ person.id }}/edit"
<p data-placement="top" data-toggle="tooltip" title="Edit"><button class="btn btn-primary btn-xs" data-title="Edit" data-toggle="modal" data-target="#edit" ><span class="glyphicon glyphicon-pencil"></span></button></p>
</a>
</td>
<td>
<a href="{{ person.id }}/delete">
<p data-placement="top" data-toggle="tooltip" title="Delete"><button class="btn btn-danger btn-xs" data-title="Delete" data-toggle="modal" data-target="#delete" ><span class="glyphicon glyphicon-trash"></span></button></p>
</a>
</td>
</tr>
{% endfor %}
</tbody>
文件urls.py(申请)
from django.conf.urls import patterns, include, url
from django.contrib import admin
from persons import views
urlpatterns = patterns('',
#url(r'^$', views.PersonsView.as_view(), name='persons'),
url(r'^$', views.persons_list, name='persons_list'),
url(r'^add/', views.persons_add, name="persons_add"),
url(r'^(?P<person_id>\d+)/edit/$', views.persons_edit, name="persons_edit"),
url(r'^(?P<person_id>\d+)/delete/$', views.persons_delete, name="persons_delete"),
)
文件urls.py(主要项目)
from django.conf.urls import patterns, include, url
from django.contrib import admin
from hr import views
urlpatterns = patterns('',
url(r'^persons/', include('persons.urls', namespace='persons')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.index, name='index'),
url(r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'login.html'}),
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
)
错误在哪里?为什么这里没有任何作用?为什么我不能将 POST 发送到数据库并添加 Person?
首先,你的views
有错误。您需要在 GET request, and handle the form when it's POST:
@login_required
def persons_add(request):
# Check if it's POST request then handle the form
if request.method == 'POST':
form = forms.PersonForm(request.POST)
if form.is_valid():
form.save()
return redirect('persons_list')
else:
# If not, you need an empty form for GET request
form = forms.PersonForm()
context = {
'form': form
}
return render(request, 'persons/persons_add.html', context)
请先更正此问题,然后我们会再次检查您的位置,一次一个步骤。
检查您的 url 路线。您目前正在向 /persons/
发帖。根据您的 url 建议更改为 /persons/add/
。
此外,您的 urls.py 主文件有误。如果你想include应用urls.py,不要和你的主路由混在一起。像这样拆分它们:
主要urls.py文件:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.index, name='index'),
url(r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'login.html'}),
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),
)
# Split your app URLs and using += patterns with their views
urlpatterns += patterns(
'persons.views',
(r'^persons/', include('persons.urls', namespace='persons')),
)