【问题标题】:update a Model field in DetailView更新 DetailView 中的 Model 字段
【发布时间】:2021-03-25 01:13:14
【问题描述】:

作为 Django 的新手,我确信有一些我没有看到的明显内容。我有一个与 userprofile 模型一对一关系的用户模型,我在其中存储个人资料照片。我混合了 DetailView 和 Formview,因为我希望用户转到他的详细信息页面并只更新照片,但不知何故它对我不起作用。我知道我可以使用 UpdateView 完成这项工作,但出于教学目的,谁能告诉我为什么这不起作用?我正在尝试更新 form_valid 方法中的模型字段,但这不起作用,它们只是保留旧值。一开始我以为是因为我这边的一些错误而无法更新的照片,但我也尝试过更新其他字符串字段,但它不起作用。这里是代码:(注释掉的字段是我尝试使用 get_object_or_404 和其他函数更新几个模型字段的地方)

class UserDetail(FormMixin, DetailView):
template_name = "users/user_detail.html"
model = User
form_class = forms.UserPhotoForm

def get_success_url(self):
    return reverse('users:user_detail', args=[str(self.get_object().pk)])

def get_context_data(self, **kwargs):
    user = self.get_object()
    form = forms.UserPhotoForm(instance=user)
    context = super().get_context_data(**kwargs)
    context['user_rating'] = CotizacionReview.objects.filter(cotizacion__user=self.get_object()).aggregate(Avg('nota'))
    context['form'] = form
    return context

def form_valid(self, form):
    form.save()
    return super(UserDetail, self).form_valid(form)

def post(self, request, *args, **kwargs):
    a = get_object_or_404(User, pk=self.get_object().id).userprofile
    form = forms.UserPhotoForm(request.FILES['avatar'], instance=a)
    # get_object_or_404(User, pk=self.get_object().id).apellido = '1234'
    if form.is_valid():
        # print(get_object_or_404(User, pk=self.get_object().id).userprofile.avatar) 
        # I tried updating several model fields here, but didnt work
        # print(request.FILES['avatar'])
        return self.form_valid(form)
    else:
        return self.form_invalid(form)

这里是模型:

class UserProfile(models.Model):
user   = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(upload_to='profile_pics', default='profile_pics/default-user-icon-4.jpg', blank=True)
telefono = models.CharField(max_length=12, blank=True)
nombre = models.CharField(max_length=64, blank=True)
apellido = models.CharField(max_length=64, blank=True)
link = models.CharField(max_length=256, blank=True)
educacion = models.CharField(max_length=256, blank=True)
experiencia = models.TextField(max_length=512, blank=True)
birthdate = models.DateField(blank=True, null=True)

@receiver(post_save, sender=User)

def update_profile_signal(sender, instance, created, **kwargs):
if created:
    UserProfile.objects.create(user=instance)

【问题讨论】:

    标签: django forms django-models detailview


    【解决方案1】:

    所以我通过在我的 form_valid 方法中使用 commit=False 来实现它:

    class UserDetail(FormMixin, DetailView):
    template_name = "users/user_detail.html"
    model = User
    form_class = forms.UserPhotoForm
    
    def get_success_url(self):
        return reverse('users:user_detail', args=[str(self.get_object().pk)])
    
    def get_context_data(self, **kwargs):
        user = self.get_object()
        form = forms.UserPhotoForm(instance=user)
        context = super().get_context_data(**kwargs)
        context['user_rating'] = CotizacionReview.objects.filter(cotizacion__user=self.get_object()).aggregate(Avg('nota'))
        context['form'] = form
        return context
    
    def form_valid(self, form):
        user_instance =  form.save(commit=False)
        user_instance.avatar = form.cleaned_data['avatar']
        user_instance.id = self.get_object().userprofile.id
        user_instance.save(update_fields=['avatar'])
    
        return super(UserDetail, self).form_valid(form)
    
    def post(self, request, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
    

    但现在我遇到了另一个问题。每次我更新照片时,都会将一张新照片保存到数据库中。有没有办法做到这一点并删除旧照片?还是换掉?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-29
      • 2016-03-21
      • 2021-12-15
      • 2016-11-12
      • 2020-07-29
      • 2016-07-11
      • 2021-05-15
      • 2017-07-27
      相关资源
      最近更新 更多