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