Django房产中介应用:用户资料更新CRUD功能实现求助
Django房产中介应用个人资料更新CRUD功能故障排查
我是Django新手,正在开发一款房产中介(Realtor)应用,希望实现用户在UI中通过CRUD功能更新个人资料,但相关请求无法正常工作。请帮忙排查问题,同时确认我提供的文件是否完整。
现有代码
views.py
from django.shortcuts import render, redirect from django.contrib import messages, auth from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from contacts.models import Contact def register(request): if request.method == 'POST': # Get form values first_name = request.POST['first_name'] last_name = request.POST['last_name'] username = request.POST['username'] email = request.POST['email'] password = request.POST['password'] password2 = request.POST['password2'] # Check if passwords match if password == password2: # Check username if User.objects.filter(username=username).exists(): messages.error(request, 'That username is taken') return redirect('register') else: if User.objects.filter(email=email).exists(): messages.error(request, 'That email is being used') return redirect('register') else: # Looks good user = User.objects.create_user( username=username, password=password, email=email, first_name=first_name, last_name=last_name) # noqa # Login after register auth.login(request, user) messages.success(request, 'You are now logged in') return redirect('index') # user.save() # messages.success( # request, 'You are now registered and can log in') # return redirect('login') else: messages.error(request, 'Passwords do not match') return redirect('register') else: return render(request, 'accounts/register.html') def login(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = auth.authenticate(username=username, password=password) if user is not None: auth.login(request, user) messages.success(request, 'You are now logged in') return redirect('dashboard') else: messages.error(request, 'Invalid credentials') return redirect('login') else: return render(request, 'accounts/login.html') def logout(request): if request.method == 'POST': auth.logout(request) messages.success(request, 'You are now logged out') return redirect('index') @login_required(login_url='login') def dashboard(request): user_contacts = Contact.objects.order_by( '-contact_date').filter(user_id=request.user.id) context = { 'contacts': user_contacts } return render(request, 'accounts/dashboard.html', context)
urls.py
from django.urls import path from . import views urlpatterns = [ path('register', views.register, name='register'), path('login', views.login, name='login'), path('logout', views.logout, name='logout'), path('dashboard', views.dashboard, name='dashboard'), path('edit_profile', views.edit_profile, name='edit_profile'), ]
HTML模板代码片段(dashboard.html)
{% extends 'base.html' %} {% block title %} | Dashboard {% endblock %} {% block content %} <section id="showcase-inner" class="py-5 text-white"> <div class="container"> <div class="row text-center"> <div class="col-md-12"> <h1 class="display-4">User Dashboard</h1> <p class="lead">Manage your BT Real Estate account</p> </div> </div> </div> </section> <!-- Breadcrumb --> <section id="bc" class="mt-3"> <div class="container"> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"> <a href="{% url 'index' %}"> <i class="fas fa-home"></i> Home </a> </li> <li class="breadcrumb-item active"> Dashboard</li> </ol> </nav> </div> </section> {% comment %} Alerts {% endcomment %} {% include 'partials/__alerts.html' %} <section id="dashboard" class="py-4"> <div class="container"> <div class="row"> <div class="col-md-12"> <h2>Welcome {{ user.first_name }} <a class="btn btn-success" href="{% url 'edit_profile' %}"> Edit Profile </a> </h2> </i> {% if contacts %} <p>Here are the property listings that you have inquired about</p> <table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">Property</th> <th></th> </tr> </thead> <tbody> {% for contact in contacts %} <tr id="listing"> <td>{{ contact.id }}</td> <td>{{ contact.listing }}</td> <td> <a class="btn btn-light" href="{% url 'listing' contact.listing_id %}">View Listing</a> </td> </tr> {% endfor %} </tbody> </table> {% else %} <p>You have not made any inquiries</p> {% endif %} </div> </div> </div> </section> {% endblock %}
问题诊断与缺失内容确认
你提供的文件不完整,且存在语法错误,这是导致功能失效的核心原因:
1. 核心功能缺失
urls.py中已配置edit_profile路由,但views.py中完全没有实现对应的视图函数,用户点击"Edit Profile"按钮后会抛出视图不存在的错误- 缺少
edit_profile对应的HTML模板,没有供用户输入更新信息的表单页面
2. 现有代码的语法错误
login函数:user = auth.authenticate(...)及后续代码缩进错误,未放入if request.method == 'POST':代码块内,GET请求时会因username和password未定义报错logout函数:代码缩进错误,if request.method == 'POST':未与函数定义对齐dashboard函数:context和return语句缩进错误,未放入函数内部,会导致变量未定义报错
修复方案
第一步:补全edit_profile视图函数
在views.py中添加以下代码:
@login_required(login_url='login') def edit_profile(request): if request.method == 'POST': # 获取表单提交的用户信息 first_name = request.POST['first_name'] last_name = request.POST['last_name'] email = request.POST['email'] # 更新当前登录用户的资料 user = request.user user.first_name = first_name user.last_name = last_name user.email = email user.save() messages.success(request, '个人资料更新成功') return redirect('dashboard') else: # GET请求时渲染编辑表单页面 return render(request, 'accounts/edit_profile.html', {'user': request.user})
第二步:创建edit_profile.html模板
在accounts模板目录下新建edit_profile.html:
{% extends 'base.html' %} {% block title %} | 编辑个人资料 {% endblock %} {% block content %} <section id="showcase-inner" class="py-5 text-white"> <div class="container"> <div class="row text-center"> <div class="col-md-12"> <h1 class="display-4">Edit Profile</h1> <p class="lead">Update your account information</p> </div> </div> </div> </section> <section id="bc" class="mt-3"> <div class="container"> <nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item"> <a href="{% url 'index' %}"> <i class="fas fa-home"></i> Home </a> </li> <li class="breadcrumb-item"> <a href="{% url 'dashboard' %}">Dashboard</a> </li> <li class="breadcrumb-item active">Edit Profile</li> </ol> </nav> </div> </section> {% include 'partials/__alerts.html' %} <section id="edit-profile" class="py-4"> <div class="container"> <div class="row"> <div class="col-md-6 mx-auto"> <div class="card"> <div class="card-header">Update Your Information</div> <div class="card-body"> <form action="{% url 'edit_profile' %}" method="POST"> {% csrf_token %} <div class="form-group"> <label for="first_name">First Name</label> <input type="text" class="form-control" id="first_name" name="first_name" value="{{ user.first_name }}" required> </div> <div class="form-group"> <label for="last_name">Last Name</label> <input type="text" class="form-control" id="last_name" name="last_name" value="{{ user.last_name }}" required> </div> <div class="form-group"> <label for="email">Email</label> <input type="email" class="form-control" id="email" name="email" value="{{ user.email }}" required> </div> <button type="submit" class="btn btn-primary btn-block">Save Changes</button> </form> </div> </div> </div> </div> </div> </section> {% endblock %}
第三步:修复现有views.py的缩进错误
- 调整
login函数的缩进:
def login(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = auth.authenticate(username=username, password=password) if user is not None: auth.login(request, user) messages.success(request, 'You are now logged in') return redirect('dashboard') else: messages.error(request, 'Invalid credentials') return redirect('login') else: return render(request, 'accounts/login.html')
- 调整
logout函数的缩进:
def logout(request): if request.method == 'POST': auth.logout(request) messages.success(request, 'You are now logged out') return redirect('index')
- 调整
dashboard函数的缩进:
@login_required(login_url='login') def dashboard(request): user_contacts = Contact.objects.order_by( '-contact_date').filter(user_id=request.user.id) context = { 'contacts': user_contacts } return render(request, 'accounts/dashboard.html', context)
内容的提问来源于stack exchange,提问作者TrevTheDev
相关产品推荐
相关产品推荐

