Очистка ImageField в Джанго - PullRequest
0 голосов
/ 13 апреля 2019

В моем проекте есть пользователи, которые имеют профиль и могут редактировать свой профиль, одним из которых является изображение профиля. Вся информация пользователя может быть отредактирована или очищена без проблем, кроме изображения профиля. Я могу отредактировать его, но не могу очистить.

Мой models.py:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=64,blank=True)
    profilePic = models.ImageField(blank=True, null=True, upload_to= path_and_rename)
    phoneNumber = models.CharField(max_length=12,blank=True)
    streetAddress = models.CharField(max_length=64,blank=True)

Мой forms.py для редактирования профиля. Я также обрезаю картинку на основе пользовательских данных.

class EditProfile(forms.ModelForm):  
    class Meta:
        model = Profile
        fields = ("name", "phoneNumber","streetAddress")
        labels = {
        'phoneNumber': _('Phone Number'),   
        'streetAddress': _('Street Address and/or Postal Code'),
        }

class PhotoForm(forms.ModelForm):
    x = forms.FloatField(widget=forms.HiddenInput())
    y = forms.FloatField(widget=forms.HiddenInput())
    width = forms.FloatField(widget=forms.HiddenInput())
    height = forms.FloatField(widget=forms.HiddenInput())

    class Meta:
        model = Profile
        fields = ('profilePic', 'x', 'y', 'width', 'height', )

    def save(self):
        photo = super(PhotoForm, self).save()

        x = self.cleaned_data.get('x')
        y = self.cleaned_data.get('y')
        w = self.cleaned_data.get('width')
        h = self.cleaned_data.get('height')

        image = Image.open(photo.profilePic)
        cropped_image = image.crop((x, y, w+x, h+y))
        resized_image = cropped_image.resize((200, 200), Image.ANTIALIAS)
        resized_image.save(photo.profilePic.path)

        return photo

Наконец, мой views.py

def settings(request):
    user= request.user 
    profile = Profile.objects.get(user=user)
    if request.method == 'GET':
        profile_form = EditProfile(instance=profile)
        f1= UserProfile(user=request.user)
        photo = PhotoForm(instance= profile)
        return render(request, 'listings/settings.html', {'form': f1,'form2': profile_form, 'profilePic':photo})

    elif request.method == 'POST':
        profile_form = EditProfile(request.POST, request.FILES, instance=profile)
        profile_form.save()
        photo_form = PhotoForm(request.POST, request.FILES,instance=profile)
        if photo_form.is_valid():
            photo_form.save()

        messages.success(request, 'Your profile has been updated!')
        return redirect("/settings")

В моем шаблоне я нажимаю кнопку очистки изображения, я даже устанавливаю id_profilePic на "", но изображение остается в объекте.

1 Ответ

0 голосов
/ 13 апреля 2019

Я исправил это.Проблема заключалась в том, что всякий раз, когда я пытаюсь очистить, значения x, y, width и height не имеют значений.Поэтому он никогда не входит в оператор if в views.py

 if photo_form.is_valid():
        photo_form.save()

Я исправил его, задав им начальные значения

...