Как обновить ввод изображений с помощью форм и шаблона Django - PullRequest
1 голос
/ 07 апреля 2019

У меня есть проект django, где пользователь имеет профиль и может загрузить изображение профиля.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= "profile/")
phoneNumber = models.CharField(max_length=12,blank=True)
streetAddress = models.CharField(max_length=64,blank=True)`

На моем сайте пользователь может редактировать свой профиль, включая изображение профиля.Для этого у меня есть форма, где начальные значения являются те, которые изначально сохранены.Forms.py:

class EditProfile(forms.ModelForm):
 def __init__(self, profile, *args, **kwargs):
    self.profile = profile
    super(EditProfile, self).__init__(*args, **kwargs)
    self.fields['name'] = forms.CharField(label='Name:', initial= profile.name,required=False)
    self.fields['phoneNumber'] = forms.CharField(label= "Phone Number:", initial= profile.phoneNumber,required=False)
    self.fields['streetAddress'] = forms.CharField(label='Street Address and/or Postal Code:', initial= profile.streetAddress,required=False)
    self.fields['profilePic'] = forms.ImageField(label='Profile Picture:', initial= profile.profilePic,required=False)

 class Meta:
    model = Profile
    fields = ("name", "phoneNumber","streetAddress", "profilePic")

Эта часть прекрасно работает, и на моем сайте я вижу сохраненные значения.Проблема в том, когда я пытаюсь их отредактировать и отправить форму.Мой views.py:

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

elif request.method == 'POST':
    userProfile = Profile.objects.get(user=user)
    f1= UserProfile(user=request.user)
    f2= EditProfile(profile=userProfile)       
    name= request.POST["name"]
    phoneNumber = request.POST["phoneNumber"]
    streetAddress = request.POST["streetAddress"]
    Profile.objects.filter(user=user).update(name= name, phoneNumber = phoneNumber, streetAddress = streetAddress)
    if "profilePic" in request.FILES:
        image1=request.FILES["profilePic"]
        fs1=FileSystemStorage()
        fs1.save(image1.name, image1)
        userProfile.profilePic = image1
        userProfile.save()
    else:
        userProfile.profilePic.delete()


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

Все редактируется без проблем, кроме файла imageFile.Если я загружаю файл, он работает, и изображение обновляется.Однако, если я не делаю никаких изменений в imageFile (т.е. я хочу сохранить то же изображение), то request.FILES будет пустым, а затем код переходит к оператору else и удаляет существующий profilePic.

Myвопрос в том, что я могу видеть исходное изображение профиля на моем сайте, поэтому с помощью forms.py работает, но почему он не передается вместе с остальной частью формы?

1 Ответ

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

Ваш вопрос немного сбивает с толку, но кажется, что вы пытаетесь заново изобрести колесо.Если вы хотите, чтобы «начальные» данные были повторно вставлены в форму, вы должны использовать собственный параметр instance .Вы можете использовать его так:

profile = Profile.objects.get(user=user)

# This can be in your GET
profile_form = EditProfile(instance=profile)

# This can be in your POST
profile_form = EditProfile(request.POST, request.FILES, instance=profile)
profile_form.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...