You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:50:16