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 - 更新模型的各个字段的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 django 模型实例的多个字段?

Django - 基于另一个字段更新模型字段

如何更新 MySQL 数据库中的 Django 模型字段

如何根据具有外键关系的另一个模型更新 Django 模型的字段

Django - 根据模型字段生成 excel 报告

保存时跳过字段(Django 模型、插入和更新)