Python 如何通过浏览器更新数据库?德扬戈
我已经成功地完成了添加阶段,但是我真的被困在编辑阶段。此功能允许管理员通过浏览器更改特定成员的详细信息。有什么想法吗?这是我为添加所做的,但没有为编辑所做的 视图Python 如何通过浏览器更新数据库?德扬戈,python,html,django,Python,Html,Django,我已经成功地完成了添加阶段,但是我真的被困在编辑阶段。此功能允许管理员通过浏览器更改特定成员的详细信息。有什么想法吗?这是我为添加所做的,但没有为编辑所做的 视图 def edit_member(request, member_id): context = RequestContext(request) members = get_object_or_404(Member, id=member_id) form = MemberForm(request.POST or N
def edit_member(request, member_id):
context = RequestContext(request)
members = get_object_or_404(Member, id=member_id)
form = MemberForm(request.POST or None, instance=member)
if request.method == 'POST':
if form.is_valid():
form.save()
else:
form = MemberForm()
return render_to_response("templates/MemberUpdate.html",
{'members': members, 'form':form},
context)
Forms.py
class MemberForm(forms.ModelForm):
class Meta:
model = Member
url(r'^$', views.index, name='index'),
url(r'profile', views.profile, name='profile'),
url(r'leaderboard', views.leaderboard, name='leaderboard'),
url(r'MemberForm', views.Form, name='MemberForm'),
url(r'MemberUpdate', views.MemberUpdate, name='MemberUpdate'),
url(r'^admin/', include(admin.site.urls)),
MemberAdd.html
{% for member in members %}
<table>
<tr>
<td>{{ member.name}}</td>
</tr>
</table>
{% endfor %}
<p><h1>Add new members</h1></p>
<table>
<form action="" method="post">
<tr>
{% csrf_token %}
{{ form.as_p }}
</tr>
<input type="submit" value = "Submit" />
</form>
您需要从以下内容开始:
member = Member.objects.get(pk=member_id)
然后
您的表单将预先填写成员属性。在POST中,将保存更改。如果要编辑特定的
成员
实例,则需要从数据库中检索该实例,然后将其传递到您的模型表单
:
def edit_member(request, member_id):
member = get_object_or_404(Member, id=member_id)
form = MemberForm(request.POST or None, instance=member)
if request.method == 'POST':
if form.is_valid():
form.save()
# do something else, like redirect to a different view
return render(request, 'edit_member.html', {'form': form})
如果要创建新成员,请执行以下操作:
def create_member(request):
form = MemberForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
form.save()
# do something else, like redirect to a different view
return render(request, 'add_member.html', {'form': form})
这是非常冗长的,因为您实际上可以在同一个视图中完成创建和编辑操作,但我想演示每个操作中发生了什么
除非您需要从视图中向模型添加非常具体的内容,否则没有理由手动从清理的数据中设置模型字段,因为表单在调用后已经这样做了。is\u valid()
此外,您还需要正确构建url模式,因为它们需要是适当的正则表达式:
url(r'^$', views.index, name='index'),
url(r'^profile/$', views.profile, name='profile'),
url(r'^leaderboard/$', views.leaderboard, name='leaderboard'),
url(r'^MemberForm/$', views.Form, name='MemberForm'),
url(r'^MemberUpdate/(?P<member_id>\d+)/$',
views.MemberUpdate, name='MemberUpdate'),
url(r'^admin/', include(admin.site.urls))
这是我唯一需要改变的吗?因为我试过了,但效果不好,不,但这只是一个开始。您需要传递
成员id
等信息。在文件里。你会想搜索“django edit form”或类似的东西。我现在完全搞不清楚@Rob LYour表单实例化是不正确的。关键字参数之前不能有位置参数。它需要是:request=MemberForm(request.POST,instance=member)
对不起,我的意思是:form=MemberForm(request.POST,instance=member)
为什么要通过从cleaned\u数据中分配成员属性来复制视图中ModelForm的所有工作?ModelForm只需调用form.save()
就知道如何持久化成员。另外,您使用的是哪个版本的Django?您的视图代码相当简单antiquated@Brandon我使用的是Django 1.7.3,我应该获取清理后的数据吗?我听了一个教程,你看那个教程一定很老了。我会为你添加一个答案。你告诉我的每件事我都做了,但它仍然不起作用!!“未找到参数为“()”且关键字参数为“{}”的'MemberUpdate'的反转。尝试了1个模式:['MemberUpdate/(?P\\d+)]”我可以问一下,成员id实际上在做什么吗?我只想在网页上显示所有成员,并具有编辑这些成员的功能。我已更新了我的答案,特别是分配了成员id。您必须确定要编辑的成员,并且传入成员的主键只是一种策略。否则,Django根本不知道您要编辑哪个成员。另一种方法是使用ModelFormset,如果您想一次编辑所有成员:顺便说一句,如果您还没有,我强烈建议您阅读Django教程,因为您所有的问题都可以通过以下方式得到解答:
def create_member(request):
form = MemberForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
form.save()
# do something else, like redirect to a different view
return render(request, 'add_member.html', {'form': form})
url(r'^$', views.index, name='index'),
url(r'^profile/$', views.profile, name='profile'),
url(r'^leaderboard/$', views.leaderboard, name='leaderboard'),
url(r'^MemberForm/$', views.Form, name='MemberForm'),
url(r'^MemberUpdate/(?P<member_id>\d+)/$',
views.MemberUpdate, name='MemberUpdate'),
url(r'^admin/', include(admin.site.urls))
{% for member in members %}
<table>
<tr>
<td><a href="{% url 'MemberUpdate' member_id=member.id %}">{{ member.name}}</a></td>
</tr>
</table>
{% endfor %}