Przeglądaj źródła

文章展示,目录,用户资料等功能基本完善,接下来进行评论功能的添加

Shellmiao 4 lat temu
rodzic
commit
83c83e79ea

+ 16 - 0
MyBlog/MyBlog/settings.py

@@ -37,6 +37,7 @@ INSTALLED_APPS = [
     'django.contrib.staticfiles',
     'article',
     'userprofile',
+    'password_reset',
 ]
 
 MIDDLEWARE = [
@@ -118,3 +119,18 @@ STATIC_URL = '/static/'
 STATICFILES_DIRS = (
     os.path.join(BASE_DIR, "static"),
 )
+# SMTP服务器,改为你的邮箱的smtp!
+EMAIL_HOST = 'smtp.exmail.qq.com'
+# 改为你自己的邮箱名!
+EMAIL_HOST_USER = 'Shellmiao@shellmiao.com'
+# 你的邮箱密码
+EMAIL_HOST_PASSWORD = 'K77o2eE5hpHBYRYy'
+# 发送邮件的端口
+EMAIL_PORT = 25
+# 是否使用 TLS
+EMAIL_USE_TLS = True
+# 默认的发件人
+DEFAULT_FROM_EMAIL = 'Shellmiao的博客 <Shellmiao@shellmiao.com>'
+
+MEDIA_URL = '/media/'
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

+ 4 - 0
MyBlog/MyBlog/urls.py

@@ -15,10 +15,14 @@ Including another URLconf
 """
 from django.contrib import admin
 from django.urls import path, include
+from django.conf import settings
+from django.conf.urls.static import static
 
 urlpatterns = [
     path('', include('article.urls', namespace='article')),
     path('admin/', admin.site.urls),
     path('article/', include('article.urls', namespace='article')),
     path('user/', include('userprofile.urls', namespace='userprofile')),
+    path('password_reset/', include('password_reset.urls')),
 ]
+urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 4 - 5
MyBlog/article/migrations/0001_initial.py

@@ -1,10 +1,9 @@
-# Generated by Django 3.1.1 on 2021-01-11 13:02
+# Generated by Django 3.1.1 on 2021-01-21 14:36
 
-import datetime
 from django.conf import settings
 from django.db import migrations, models
 import django.db.models.deletion
-from django.utils.timezone import utc
+import django.utils.timezone
 
 
 class Migration(migrations.Migration):
@@ -22,8 +21,8 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('title', models.CharField(max_length=100)),
                 ('body', models.TextField()),
-                ('created', models.DateTimeField(default=datetime.datetime(2021, 1, 11, 13, 2, 9, 738792, tzinfo=utc))),
-                ('updated', models.DateTimeField(auto_now=True)),
+                ('created', models.DateTimeField(default=django.utils.timezone.now)),
+                ('updated', models.DateTimeField(default=django.utils.timezone.now)),
                 ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
             ],
             options={

+ 18 - 0
MyBlog/article/migrations/0002_articlepost_total_views.py

@@ -0,0 +1,18 @@
+# Generated by Django 3.1.1 on 2021-01-23 10:37
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('article', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='articlepost',
+            name='total_views',
+            field=models.PositiveIntegerField(default=0),
+        ),
+    ]

+ 0 - 25
MyBlog/article/migrations/0002_auto_20210111_2106.py

@@ -1,25 +0,0 @@
-# Generated by Django 3.1.1 on 2021-01-11 13:06
-
-import datetime
-from django.db import migrations, models
-from django.utils.timezone import utc
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('article', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='articlepost',
-            name='created',
-            field=models.DateTimeField(default=datetime.datetime(2021, 1, 11, 13, 6, 7, 993233, tzinfo=utc)),
-        ),
-        migrations.AlterField(
-            model_name='articlepost',
-            name='updated',
-            field=models.DateTimeField(default=datetime.datetime(2021, 1, 11, 13, 6, 7, 993233, tzinfo=utc)),
-        ),
-    ]

+ 0 - 24
MyBlog/article/migrations/0003_auto_20210111_2110.py

@@ -1,24 +0,0 @@
-# Generated by Django 3.1.1 on 2021-01-11 13:10
-
-from django.db import migrations, models
-import django.utils.timezone
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('article', '0002_auto_20210111_2106'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='articlepost',
-            name='created',
-            field=models.DateTimeField(default=django.utils.timezone.now),
-        ),
-        migrations.AlterField(
-            model_name='articlepost',
-            name='updated',
-            field=models.DateTimeField(default=django.utils.timezone.now),
-        ),
-    ]

+ 1 - 0
MyBlog/article/models.py

@@ -12,6 +12,7 @@ class ArticlePost(models.Model):
     body = models.TextField()
     created = models.DateTimeField(default=timezone.now) #使用timezone.now()时 进行数据迁移会,有警告
     updated = models.DateTimeField(default=timezone.now)
+    total_views=models.PositiveIntegerField(default=0)
 
     class Meta:
         ordering = ('-created',)

+ 1 - 1
MyBlog/article/urls.py

@@ -8,7 +8,7 @@ urlpatterns = [
     path('', views.article_list, name='test'),
     path('article_detail/<int:id>/', views.article_detail, name='article_detail'),
     path('article_create/', views.article_create, name='article_create'),
-    path('article_delete/<int:id>/', views.article_delete, name='article_delete'),
+    # path('article_delete/<int:id>/', views.article_delete, name='article_delete'),
     path('article_safe_delete/<int:id>/', views.article_safe_delete, name='article_safe_delete'),
     path('article_update/<int:id>/', views.article_update, name='article_update'),
 ]

+ 59 - 22
MyBlog/article/views.py

@@ -3,27 +3,56 @@ from django.http import HttpResponse
 from .models import ArticlePost
 from .form import ArticlePostForm
 from django.contrib.auth.models import User
+from django.contrib.auth.decorators import login_required
+from django.core.paginator import Paginator
+from django.db.models import Q
 import markdown
 
 
 # 视图函数
 def article_list(request):
-    articles = ArticlePost.objects.all()
-    context = {'articles': articles}
+    search = request.GET.get('search')
+    order = request.GET.get('order')
+    if search:
+        if order == 'total_views':
+            article_list = ArticlePost.objects.filter(
+                Q(title__icontains=search) |
+                Q(body__icontains=search)
+            ).order_by('-total_views')
+        else:
+            article_list = ArticlePost.objects.filter(
+                Q(title__icontains=search) |
+                Q(body__icontains=search)
+            )
+    else:
+        search = ''
+        if order == 'total_views':
+            article_list = ArticlePost.objects.all().order_by('total_views')
+        else:
+            article_list = ArticlePost.objects.all()
+    paginator = Paginator(article_list, 3)
+    page = request.GET.get('page')
+    articles = paginator.get_page(page)
+    context = {'articles': articles, 'order': order, 'search': search}
     return render(request, 'article/list.html', context)
 
 
 def article_detail(request, id):
     articles = ArticlePost.objects.get(id=id)
-    articles.body = markdown.markdown(articles.body,
-                                      extensions=[
-                                          'markdown.extensions.extra',
-                                          'markdown.extensions.codehilite',
-                                      ])
-    context = {'article': articles}
+    articles.total_views += 1
+    articles.save(update_fields=['total_views'])
+    md = markdown.Markdown(
+        extensions=[
+            'markdown.extensions.extra',
+            'markdown.extensions.codehilite',
+            'markdown.extensions.toc'
+        ])
+    articles.body = md.convert(articles.body)
+    context = {'article': articles, 'toc': md.toc}
     return render(request, 'article/detail.html', context)
 
 
+@login_required(login_url='/user/login/')
 def article_create(request):
     if request.method == 'POST':
         article_post_form = ArticlePostForm(data=request.POST)
@@ -31,7 +60,7 @@ def article_create(request):
         if article_post_form.is_valid():
             # 保存数据,但是暂时不提交到数据库中
             new_article = article_post_form.save(commit=False)
-            new_article.author = User.objects.get(id=1)
+            new_article.author = User.objects.get(id=request.user.id)
             # 将新文章保存到数据库中
             new_article.save()
             return redirect("article:article_list")
@@ -53,27 +82,35 @@ def article_delete(request, id):
     return redirect("article:article_list")
 
 
+@login_required(login_url='/user/login/')
 def article_safe_delete(request, id):
     if request.method == 'POST':
         article = ArticlePost.objects.get(id=id)
-        article.delete()
-        return redirect("article:article_list")
+        if article.author == User.objects.get(id=request.user.id):
+            article.delete()
+            return redirect("article:article_list")
+        else:
+            return HttpResponse("你无权限进行此操作")
     else:
         return HttpResponse("仅允许POST请求")
 
 
+@login_required(login_url='/user/login/')
 def article_update(request, id):
     article = ArticlePost.objects.get(id=id)
-    if request.method == 'POST':
-        article_post_form = ArticlePostForm(data=request.POST)
-        if article_post_form.is_valid():
-            article.title = request.POST['title']
-            article.body = request.POST['body']
-            article.save()
-            return redirect("article:article_detail", id=id)
+    if article.author == User.objects.get(id=request.user.id):
+        if request.method == 'POST':
+            article_post_form = ArticlePostForm(data=request.POST)
+            if article_post_form.is_valid():
+                article.title = request.POST['title']
+                article.body = request.POST['body']
+                article.save()
+                return redirect("article:article_detail", id=id)
+            else:
+                return HttpResponse("表单内容有误,请重新填写")
         else:
-            return HttpResponse("表单内容有误,请重新填写")
+            article_post_form = ArticlePostForm()
+            context = {'article': article, 'article_post_form': article_post_form}
+            return render(request, 'article/update.html', context)
     else:
-        article_post_form = ArticlePostForm()
-        context = {'article': article, 'article_post_form': article_post_form}
-        return render(request, 'article/update.html', context)
+        return HttpResponse("你无权进行此操作")

+ 0 - 0
MyBlog/comment/__init__.py


+ 3 - 0
MyBlog/comment/admin.py

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 5 - 0
MyBlog/comment/apps.py

@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class CommentConfig(AppConfig):
+    name = 'comment'

+ 0 - 0
MyBlog/comment/migrations/__init__.py


+ 3 - 0
MyBlog/comment/models.py

@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.

+ 3 - 0
MyBlog/comment/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 3 - 0
MyBlog/comment/views.py

@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.

BIN
MyBlog/db.sqlite3


BIN
MyBlog/media/avatar/20210123/157767.jpg


+ 49 - 36
MyBlog/templates/article/detail.html

@@ -6,46 +6,59 @@
 {% block content %}
     <div class="container">
         <div class="row">
-            <h1 class="col-12 mt-4 mb-4">
-                {{ article.title }}
-            </h1>
-            <div class="col-12 alert alert-success">
-                作者: {{ article.author }}
-                 · <a href="#" onclick="confirm_delete()">
-                    删除文章
-                </a>
-                 · <a href="{% url 'article:article_update' article.id %}">
-                    编辑文章
-                </a>
-                <form style="display: none"
-                      id="safa_delete"
-                      action="{% url 'article:article_safe_delete' article.id %}"
-                      method="post"
-                >
-                    {% csrf_token %}
-                    <button type="submit">
-                        发送
-                    </button>
-                </form>
+            <div class="col-3 mt-4">
+                <h4><strong>目录</strong></h4>
+                <hr>
+                <div>
+                    {{ tor|safe }}
+                </div>
             </div>
-            <div class="col-12">
-                <p>
-                    {{ article.body|safe }}
-                </p>
+            <div class="col-9">
+                <h1 class="mt-4 mb-4">
+                    {{ article.title }}
+                </h1>
+                <div class="col-12 alert alert-success">
+                    作者: {{ article.author }}
+                    {% if user == article.author %}
+                        · <a href="#" onclick="confirm_delete()">
+                        删除文章
+                    </a>
+                        · <a href="{% url 'article:article_update' article.id %}">
+                        编辑文章
+                    </a>
+                    {% endif %}
+                    <div>
+                        浏览:{{ article.total_views }}
+                    </div>
+                    <form style="display: none"
+                          id="safa_delete"
+                          action="{% url 'article:article_safe_delete' article.id %}"
+                          method="post"
+                    >
+                        {% csrf_token %}
+                        <button type="submit">
+                            发送
+                        </button>
+                    </form>
+                </div>
+                <div class="col-12">
+                    <p>
+                        {{ article.body|safe }}
+                    </p>
+                </div>
             </div>
-
         </div>
     </div>
     <script>
-    function confirm_delete(){
-        layer.open({
-            title:"删除文章",
-            content:"确认删除这篇文章吗?",
-            yes:function (index,layero){
-                $('form#safe_delete button').click();
-                layer.close(index);
-            },
-        })
-    }
+        function confirm_delete() {
+            layer.open({
+                title: "删除文章",
+                content: "确认删除这篇文章吗?",
+                yes: function (index, layero) {
+                    $('form#safe_delete button').click();
+                    layer.close(index);
+                },
+            })
+        }
     </script>
 {% endblock content %}

+ 71 - 0
MyBlog/templates/article/list.html

@@ -5,6 +5,43 @@
 {% endblock title %}
 {% block content %}
     <div class="container">
+        <nav aria-label="breadcrumb">
+            <ol class="breadcrumb">
+                <li class="breadcrumb-item">
+                    <a href="{% url 'article:article_list' %}?search={{ search }}">
+                        最新
+                    </a>
+                </li>
+                <li class="breadcrumb-item">
+                    <a href="{% url 'article:article_list' %}?order=total_views&search={{ search }}">
+                        最热
+                    </a>
+                </li>
+            </ol>
+        </nav>
+        <div class="row">
+            <div class="col-auto mr-auto">
+                <form class="form-inline">
+                    <label class="sr-only">
+                        content
+                    </label>
+                    <input type="text" class="form-control mb-2 mr-sm-2" name="search" placeholder="搜索文章..." required>
+                </form>
+            </div>
+        </div>
+        {% if search %}
+            {% if articles %}
+                <h4>
+                    <span style="color: red">"{{ search }}"</span>的搜索结果如下:
+                </h4>
+                <hr>
+            {% else %}
+                <h4>
+                    暂无
+                    <span style="color: red">"{{ search }}"</span>有关的文章。
+                </h4>
+            {% endif %}
+        {% endif %}
         <div class="row mt-2">
             {% for article in articles %}
                 <div class="col-4 mb-4">
@@ -21,11 +58,45 @@
                             <a href="{% url 'article:article_detail' article.id %}" class="btn btn-primary">
                                 阅读本文
                             </a>
+                            <span>
+                                <small class="col align-self-end" style="color: gray;">
+                                    浏览:{{ article.total_views }}
+                                </small>
+                            </span>
                         </div>
                     </div>
                 </div>
             {% endfor %}
 
         </div>
+        <div class="pagination row">
+            <div class="m-auto">
+            <span class="step-links">
+                <!--如果不是第一页,则显示上翻的按钮-->
+                {% if articles.has_previous %}
+                    <a href="?page=1&order={{ order }}&search={{ search }}" class="btn btn-success">
+                    &laquo;1
+                    </a>
+                    <span>...</span>
+                    <a href="?page={{ articles.previous_page_number }}&order={{ order }}&search={{ search }}" class="btn btn-secondary">
+                    {{ articles.previous_page_number }}
+                    </a>
+                {% endif %}
+                <!--当前页面-->
+                <span class="current btn btn-danger btn-lg">
+                    {{ articles.number }}
+                </span>
+                {% if articles.has_next %}
+                    <a href="?page={{ articles.next_page_number }}&order={{ order }}&search={{ search }}" class="btn btn-secondary">
+                    {{ articles.next_page_number }}
+                    </a>
+                    <span>...</span>
+                    <a href="?page={{ articles.paginator.num_pages }}&order={{ order }}&search={{ search }}" class="btn btn-success">
+                    {{ articles.paginator.num_pages }} &raquo
+                    </a>
+                {% endif %}
+            </span>
+            </div>
+        </div>
     </div>
 {% endblock content %}

+ 1 - 0
MyBlog/templates/header.html

@@ -24,6 +24,7 @@
                             {{ user.username }}
                         </a>
                         <div class="dropdown-menu" aria-labelledby="navbarDropdown">
+                            <a class="dropdown-item" href="{% url 'userprofile:edit' user.id %}">个人信息</a>
                             <a class="dropdown-item" href="{% url 'userprofile:logout' %}">退出登录</a>
                             <a class="dropdown-item" href="#" onclick="user_delete()">删除用户</a>
                         </div>

+ 53 - 0
MyBlog/templates/userprofile/edit.html

@@ -0,0 +1,53 @@
+{% extends "base.html" %}
+{% load static %}
+{% block title %}
+    用户信息
+{% endblock title %}
+{% block content %}
+    <div class="container">
+        <div class="row">
+            <div class="col-12">
+                <br>
+                <div class="col-md-4">
+                    用户名:{{ user.username }}
+                </div>
+                {% if profile.avatar %}
+                    <div class="col-md-4">
+                        头像
+                    </div>
+                    <img src="{{ profile.avatar.url }}" styl="max-width: 20%; border-radius: 15%;" class="col-md-4">
+                {% else %}
+                    <h5 class="col-md-4">
+                        暂无头像
+                    </h5>
+                {% endif %}
+                <br>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div class="form-group">
+                        <label for="avatar">上传头像</label>
+                        <input type="file" class="form-control-file" name="avatar" id="avatar">
+                    </div>
+                    <div class="form-group col-md-4">
+                        <label for="phone">
+                            电话
+                        </label>
+                        <input type="text" class="form-control" id="phone" name="phone" value="{{ profile.phone }}">
+                    </div>
+                    <div class="form-group col-md-4">
+                        <label for="bio">
+                            简介
+                        </label>
+                        <textarea type="text" class="form-control" id="bio" name="bio" rows="12">
+                        {{ profile.bio }}
+                    </textarea>
+                    </div>
+                    <button type="submit" class="btn btn-primary">
+                        提交
+                    </button>
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock content %}

+ 8 - 0
MyBlog/templates/userprofile/login.html

@@ -32,6 +32,14 @@
                     <!-- 提交按钮 -->
                     <button type="submit" class="btn btn-primary">提交</button>
                 </form>
+                <br>
+                <h5>
+                    忘记密码了?
+                </h5>
+                <h5>
+                    点击<a href="{% url "password_reset_recover" %}">这里</a>
+                    重置密码
+                </h5>
             </div>
         </div>
     </div>

+ 19 - 1
MyBlog/userprofile/admin.py

@@ -1,3 +1,21 @@
 from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
+from django.contrib.auth.models import User
 
-# Register your models here.
+from .models import Profile
+
+
+# 定义一个行内admin
+class ProfileInline(admin.StackedInline):
+    model = Profile
+    can_delete = False
+    verbose_name_plural = 'UserProfile'
+
+
+class UserAdmin(BaseUserAdmin):
+    inlines = (ProfileInline,)
+
+
+# 重新注册User
+admin.site.unregister(User)
+admin.site.register(User, UserAdmin)

+ 7 - 0
MyBlog/userprofile/form.py

@@ -1,5 +1,6 @@
 from django import forms
 from django.contrib.auth.models import User
+from .models import Profile
 
 
 class UserLoginForm(forms.Form):
@@ -21,3 +22,9 @@ class UserRegisterForm(forms.ModelForm):
             return data.get('password')
         else:
             raise forms.ValidationError('密码输入不一致,请重试')
+
+
+class ProfileForm(forms.ModelForm):
+    class Meta:
+        model = Profile
+        fields = ('phone', 'avatar', 'bio')

+ 27 - 0
MyBlog/userprofile/migrations/0001_initial.py

@@ -0,0 +1,27 @@
+# Generated by Django 3.1.1 on 2021-01-21 14:36
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Profile',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('phone', models.CharField(blank=True, max_length=20)),
+                ('avatar', models.ImageField(blank=True, upload_to='avatar/%Y%m%d/')),
+                ('bio', models.TextField(blank=True, max_length=500)),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]

+ 31 - 1
MyBlog/userprofile/models.py

@@ -1,3 +1,33 @@
 from django.db import models
+from django.contrib.auth.models import User
+# 引入内置信号
+from django.db.models.signals import post_save
+# 引入信号接收器的装饰器
+from django.dispatch import receiver
 
-# Create your models here.
+
+# 用户拓展信息
+class Profile(models.Model):
+    # 与User模型构成一对一关系
+    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
+    phone = models.CharField(max_length=20, blank=True)
+    # 头像
+    avatar = models.ImageField(upload_to='avatar/%Y%m%d/', blank=True)
+    # 个人简介
+    bio = models.TextField(max_length=500, blank=True)
+
+    def __str__(self):
+        return 'user {}'.format(self.user.username)
+
+
+# 信号接收函数,每当新建User实例的时候自动调用
+@receiver(post_save, sender=User)
+def create_user_profile(sender, instance, created, **kwargs):
+    if created:
+        Profile.objects.create(user=instance)
+
+
+# 信号接收函数,每当更新User实例的时候自动调用
+@receiver(post_save, sender=User)
+def save_user_profile(sender, instance, **kwargs):
+    instance.profile.save()

+ 2 - 1
MyBlog/userprofile/urls.py

@@ -7,5 +7,6 @@ urlpatterns = [
     path('login/', views.user_login, name='login'),
     path('logout/', views.user_logout, name='logout'),
     path('register/', views.user_register, name='register'),
-    path('delete/<int:id>', views.user_delete, name='delete'),
+    path('delete/<int:id>/', views.user_delete, name='delete'),
+    path('edit/<int:id>/', views.profile_edit, name='edit'),
 ]

+ 28 - 1
MyBlog/userprofile/views.py

@@ -4,6 +4,8 @@ from django.http import HttpResponse
 from .form import UserLoginForm, UserRegisterForm
 from django.contrib.auth.models import User
 from django.contrib.auth.decorators import login_required
+from .models import Profile
+from .form import ProfileForm
 
 
 def user_login(request):
@@ -58,7 +60,7 @@ def user_register(request):
 def user_delete(request, id):
     if request.method == 'POST':
         user = User.objects.get(id=id)
-        if request.user==user:
+        if request.user == user:
             logout(request)
             user.delete()
             return redirect('article:article_list')
@@ -66,3 +68,28 @@ def user_delete(request, id):
             return HttpResponse('你没有删除该用户的权限')
     else:
         return HttpResponse('仅接受POST请求')
+
+
+@login_required(login_url='/user/login/')
+def profile_edit(request, id):
+    user = User.objects.get(id=id)
+    profile = Profile.objects.get(user_id=id)
+    if request.method == 'POST':
+        if request.user != user:
+            return HttpResponse('你没有权限修改此用户信息')
+        profile_form = ProfileForm(request.POST, request.FILES)
+        if profile_form.is_valid():
+            profile_cd = profile_form.cleaned_data
+            profile.phone = profile_cd['phone']
+            profile.bio = profile_cd['bio']
+            profile.avatar = profile_cd["avatar"]
+            profile.save()
+            return redirect('userprofile:edit', id=id)
+        else:
+            return HttpResponse('注册表单有误,请重新输入')
+    elif request.method == 'GET':
+        profile_form = ProfileForm()
+        context = {'profile_form': profile_form, 'profile': profile, 'user': user}
+        return render(request, 'userprofile/edit.html', context)
+    else:
+        return HttpResponse('请使用GET或POST方法请求数据')