python - 在 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">
我不知道怎么做?我该怎么做?谢谢!
解决方案
问题出在<form action="{% url 'show_profile' pk=user.id %}" method="PUT" enctype="multipart/form-data">
. PUT
html 标签中没有方法form
。您必须使用 javascript 来发送此类请求。
PS 可以使用 发送类似 put 的请求form
,但它看起来很难看,而且不会是 REST
推荐阅读
- java - 为什么列表数组在 onCreate 方法中失去了它的价值?
- java - 如何使用带有结果集转换器的休眠存储过程查询
- c++ - c++ 移动语义:何时需要明确?
- javascript - PHP 图片上传后更新 HTML 中 Image-Tag 的 SRC
- javascript - .html() 不能与 fadeOut() 一起正常工作;
- android - 如何在 kotlin 中将 Header 添加到 recyclerview?
- javascript - 仅从第一个父项中删除 id div
- python - Django - 在 My PhoneReview 应用程序中实现模型和视图的问题
- javascript - 角度 8 中的下一个可选路线
- oracle - PL/SQL 不打印到控制台(在 SQLDeveloper 中)