Django - 更新模型的各个字段
Posted
技术标签:
【中文标题】Django - 更新模型的各个字段【英文标题】:Django - update individual fields of a model 【发布时间】:2020-06-08 08:18:20 【问题描述】:我正在开发一个 django 项目,我有一个用户模型,每个用户都有一个 UserProfile。
我想实现一个表单,以便用户可以更新他的个人资料图片。
这是我目前所拥有的:
modely.py
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='profile', on_delete=models.CASCADE)
following = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='followed_by')
image = models.ImageField(upload_to=upload_image_path,null=True,blank=True, default="False")
is_online = models.BooleanField(default=False,null=True,blank=True )
username = models.CharField(max_length=200,null=True,blank=True)
follows = models.CharField(max_length=400,null=True,blank=True)
objects = UserProfileManager()
views.py
def update_image(request,username):
response_data =
if request.method == 'POST':
image = request.POST.get('image')
response_data['image'] = image
UserProfile.objects.create(
image = image
)
return JsonResponse(response_data)
context =
'image':image
return render(request, 'userprofile.html', context)
forms.py
class ProfileUpdateForm(forms.Form):
image = forms.ImageField(required=False,label='image')
def clean(self):
blocked_chars = set(punctuation)
cleaned_data = super(ProfileUpdateForm, self).clean()
image = cleaned_data.get('image')
filename, file_extension = os.path.splitext(image)
if not ".jpg" or '.png' in file_extension:
raise forms.ValidationError(filename + 'is not an image')
return image
urls.py
url(r'^(?P<username>[\w-]+)/update-image/$', update_image, name='update_image'),
index.html
<form id="profile_form" class="profile_form" method='POST' enctype="multipart/form-data" form_data=" request.user.profile.get_update_image_url ">
% csrf_token %
<div class="profile_form_group">
<div class="profile_table">
<div class="utable_row">
<div class="utable_th_1">
<span class="user_detail"> form </span>
</div>
<div class="utable_th_2">
<span class="user_detail">
<input class='profile_img_btn' type="submit" value="Update Image"/>
</span>
</div>
</div>
</div>
</div>
</form>
main.js
var i_link = $('.profile_form').attr('form_data');
console.log(i_link)
$(document).on('submit', '#profile_form',function(e)
e.preventDefault();
$.ajax(
type: 'POST',
url: i_link,
data:
image :$('#id_image').val(),
csrfmiddlewaretoken :$('input[name=csrfmiddlewaretoken]').val(),
action : 'post'
,
success:function(json,data,i_link)
console.log("HEY, THIS IS WORKING !" + data + i_link)
document.getElementById("profile_form").reset();
,
error : function(xhr,errmsg,err)
console.log("HEY, THIS IS NOT WORKING !")
console.log(xhr.status + ": " + xhr.responseText);
);
);
我收到此错误:
NOT NULL constraint failed: accounts_userprofile.user_id
如何更新模型的各个字段?
谢谢
【问题讨论】:
【参考方案1】:您缺少模型。能否请您分享一下这些信息。
问题可能是您的模型希望在配置文件中填写此 ID,但您的表单未设置该值。修复可能只是添加一个默认值或将 null 或空白设置为 True
【讨论】:
似乎是一个相当普遍的问题,这可能与此有关:***.com/questions/16589069/… 已添加到帖子中 是的,这几乎符合我的预期。您的个人资料模型期望您提供一个用户字段,该字段在您的错误消息中被标识为 [app]_[model].[field] 在您的情况下,默认情况下它是“accounts_userprofile.user_id”,后缀 _id 添加在update_image() 您的 UserProfile.objects.create() 需要提供所有必需的模型字段。祝你好运!【参考方案2】:问题出在您的 update_image 视图中。
您正在尝试在未提供所需模型字段的情况下创建新配置文件
UserProfile.objects.create(
image = image
)
您应该在请求中使用提供的用户获取所需的实例,然后在保存/创建之前更新图像字段
【讨论】:
以上是关于Django - 更新模型的各个字段的主要内容,如果未能解决你的问题,请参考以下文章