django如何使用UserChangeForm

时间:2017-07-09 14:52:43

标签: python django

我正在使用django制作网站。我正在学习如何让超级用户使用表格更改帐户信息'由youtube。但是,我有一个问题需要去编辑页面。

管理应用中的member_management.html

      {% for staff in staff_list %}
        <tr>
            <td><a href="{% url "management:edit_staff" staff.id %}">{{ staff }}</a></td>
            <td>{{ staff.birth }}</td>
            <td>{{ staff.groups.all.0 }}</td>
        </tr>
        {% endfor %}

如果我点击{{staff}},页面网址会更改&#39; management / member_management&#39;到&#39; management / member_management / edit_staff / 1&#39; (1是员工ID)。但是页面没有进入edit_staff页面,而是重定向memeber_management页面(本页)。

我在管理应用中的urls.py

  from django.conf.urls import url, include
  from management import views

   urlpatterns = [
url(r'^member_management/', views.member_management, name='member_management'),
url(r'^member_management/edit_staff/(?P<staff_id>\d+)', views.edit_staff, name="edit_staff"),  
 ]

我在管理应用中的views.py

from django.conf import settings
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserChangeForm
from authentication.models import User
from staff.models import Member

def member_management(request):
    staff_list = User.objects.all()
    member_list = Member.objects.all()
    context = {
        'staff_list':staff_list,
        'member_list' : member_list,
    }
    return render(request, 'management/member_management.html', context)

def edit_staff(request, staff_id):
    staff = User.objects.get(id=staff_id)
    print("sdf")

    if request.method == 'POST':
        form = UserChangeForm(request.POST, instance=staff)

        if form.is_valid():
            form.save()
            return redirect('member_management')
    else:
        staff = User.objects.get(id=staff_id)
        form = UserChangeForm(instance=staff)

    context = {
        'form' : form,
    }
    return render(request, 'management/edit_staff.html', context)

问题是什么?任何错误都不会出现在我的CMD中,也许是我想念的一些路线。 任何帮助对我都非常有帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您可以解决此问题,只需将 $(字符串结尾符合字符)放在第一个网址的末尾即可。

urlpatterns = [
    url(r'^member_management/$', views.member_management, 
      name='member_management'),
    url(r'^member_management/edit_staff/(?P<staff_id>\d+)', 
      views.edit_staff, name="edit_staff"),  
]
  

请注意,此示例中的正则表达式没有$   (字符串结尾匹配字符)但包含尾部斜杠。   每当Django遇到include()(django.conf.urls.include())时,它就会出现   切断与该点匹配的URL的任何部分并发送   包含URLconf的剩余字符串,以便进一步处理。

如果你没有把$,你可能会遇到意想不到的结果,如:

management / member_management / edit_staff / 1 / foo / bar / baz将匹配,并将调用 views.edit_staff

为避免这种情况,您应该在edit_staff网址上加上 $

url(r'^member_management/edit_staff/(?P<staff_id>\d+)$', 
      views.edit_staff, name="edit_staff"),