首页 > 解决方案 > 在 django 中更新

问题描述

我是 django 的新手,我想制作一个更新视图,但我无法成功。我有页一个显示用户信息的页面,当我按下“更新我的个人资料”按钮时,我想更新或保存(即,如果我将“Laszlo”更改为“Lucy”,我想更新它,如果我写'nickname' 输入:'NICKNAME' 我想将该信息保存到 de dababase 中,以便下次访问此页面时向我显示有关用户的所有信息)

我的模型:'UserProfile'(即'User')和'User_Details'(它们是1-1关系)

class UserProfile(AbstractUser):
    pass


class User_Details(models.Model):
    user = models.OneToOneField(UserProfile, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=50, blank = True)
    last_name = models.CharField(max_length=50, blank=True)
    gender = models.CharField(max_length=6, blank=True, default='')
    image = models.ImageField(upload_to='avatar_image', blank=True, null=True)
    public_info=models.CharField(max_length=100, blank=False, default='')
    nickname=models.CharField(max_length=100,blank=True,default="")
    website=models.CharField(max_length=100,blank=True,default="")

我显示信息的观点:

class ShowProfile(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'profile.html'


    def get(self, request, pk, format=None):
        details = UserProfile.objects.get(id=pk)
        serializer = UserProfileSerializer(details)
        pprint.pprint(json.loads(JSONRenderer().render(serializer.data)))
        return Response({'seri':serializer.data})

序列化器:

class UserDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = User_Details
        fields = (
            'first_name',
            'last_name',
            'gender',
            'public_info',
            'nickname',
            'website'
        )

class UserProfileSerializer(serializers.ModelSerializer):
    user_details = UserDetailsSerializer()
    lookup_field = 'username'
    class Meta:
        model = UserProfile
        fields = ('id', 'user_details')

模板:

{% extends 'base2.html' %}
{% load rest_framework %}
{% block content %}





<div class="container">


    <div class="row">
        <div class="col-md-3 ">
             <div class="list-group ">
              <a href="#" class="list-group-item list-group-item-action active">Profile</a>
              <a href="{% url 'show_my_posts'  pk=user.id %}" class="list-group-item list-group-item-action">My Posts</a>



            </div>
        </div>
        <div class="col-md-9">
            <div class="card">
                <div class="card-body">
                    <div class="row">
                        <div class="col-md-12">
                            <h4>Your Profile</h4>
                            <hr>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-12">
                            <form>
                              <div class="form-group row">
                                <label for="username" class="col-4 col-form-label">User Name*</label>
                                <div class="col-8">
                                  <input id="username" name="username" placeholder="" class="form-control here" required="required" type="text">
                                </div>
                              </div>
                              <div class="form-group row">
                                <label for="name" class="col-4 col-form-label">First Name</label>
                                <div class="col-8">
                                  <input id="name" name="first_name" placeholder= {{ seri.user_details.first_name }} class="form-control here" type="text">
                                </div>
                              </div>
                              <div class="form-group row">
                                <label for="lastname" class="col-4 col-form-label">Last Name</label>
                                <div class="col-8">
                                  <input id="lastname" name="last_name" placeholder={{ seri.user_details.last_name}} class="form-control here" type="text">
                                </div>
                              </div>
                              <div class="form-group row">
                                <label for="text" class="col-4 col-form-label">Nick Name*</label>
                                <div class="col-8">
                                  <input id="text" name="nickname" placeholder="{{ seri.user_details.nickname}}" class="form-control here" required="required" type="text">
                                </div>
                              </div>
                              <div class="form-group row">
                                <label for="website" class="col-4 col-form-label">Website</label>
                                <div class="col-8">
                                  <input id="website" name="website" placeholder="{{seri.user_details.website}} " class="form-control here" type="text">
                                </div>
                              </div>
                              <div class="form-group row">
                                <label for="publicinfo" class="col-4 col-form-label">Public Info</label>
                                <div class="col-8">
                                  <textarea id="publicinfo" name="public_info" cols="40" rows="4" class="form-control" placeholder='{{seri.user_details.public_info}}'></textarea>
                                </div>
                              </div>
                                <div class="form-group row">
                                <div class="offset-4 col-8">
                                  <button name="submit" type="submit" class="btn btn-primary">Update My Profile</button>
                                </div>
                              </div>
                            </form>
                        </div>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>



{% endblock %}

我试图做到这一点(进入“ShowProfile”视图):

    def put(self, request,pk):
        serializer = ProfileUpdateSerializer()
        post = request.POST.copy()
        serializer.update(validated_data=dict(post))
        return HttpResponseRedirect('/account/login.html')

串行器

class ProfileUpdateSerializer(serializers.HyperlinkedModelSerializer):

    first_name = serializers.CharField(source='User_Details.first_name')
    last_name = serializers.CharField(source='User_Details.last_name')
    gender = serializers.CharField(source='User_Details.gender')
    public_info = serializers.CharField(source='User_Details.public_info')
    # image=serializers.ImageField(source='User_Details.image')
    nickname = serializers.CharField(source='User_Details.nickname')
    website = serializers.CharField(source='User_Details.website')

    class Meta:
        model = User_Details
        fields = ('first_name', 'last_name', 'gender', 'public_info', 'nickname', 'website')

    def update(self, validated_data, uid):
        user = UserProfile.objects.get(id=uid)


        firstname = validated_data.pop('user_details.firstname')[0]
        lastname = validated_data.pop('user_details.lastname')[0]

        user.user_details.firstname = firstname
        user.user_details.lastname = lastname

        # if avatar:
        #     user.user_details.avatar = avatar
        # if password != '':
        #     user.set_password(password)

        user.user_details.save()
        user.save()
        return user

在模板中我用这个改变'':

 <form action="{% url 'show_profile'  pk=user.id %}" method="PUT" enctype="multipart/form-data">

我不知道怎么做?我该怎么做?谢谢!

标签: pythondjango-rest-framework

解决方案


问题出在<form action="{% url 'show_profile' pk=user.id %}" method="PUT" enctype="multipart/form-data">. PUThtml 标签中没有方法form。您必须使用 javascript 来发送此类请求。

PS 可以使用 发送类似 put 的请求form,但它看起来很难看,而且不会是 REST


推荐阅读