Невозможно обновить изображение профиля пользователя в django - PullRequest
0 голосов
/ 08 января 2020

Я хотел бы разрешить пользователю загружать профиль и обновлять загруженный профиль как новое изображение профиля пользователя.

Я попытался выполнить руководство, которое нашел на YouTube, и прочел некоторые ответы на stackoverflow, но все еще борется.

Это то, что у меня есть в forms.py:

# edit mentor profile
class MentorProfileForm(forms.ModelForm):
    class Meta:
        model = User
        exclude = ('password',)
    def clean_avatar(self):
        avatar =  self.cleaned_data['avatar']
        try:
            w,h = get_image_dimensions(avatar)
            #validate size
            max_width = max_height = 100
            if w > max_width or h > max_height:
                raise forms.ValidationError(
                    u'Please use an image that is '
                    '%s x %s pixels or smaller.' %(max_width,max_height))
            #validate content type
            main, sub = avatar.content_type.split('/')
            if not (main == 'image' and sub in ['jpeg','pjpeg','gif','png']):
                raise forms.ValidationError(u'Please use a JPEG, '
                                            'GIF or PNG image.')
            #validate file size
            if len(avatar) > (20 * 1024):
                raise forms.ValidationError(
                    u'Image file must not exceed 20k.'
                )
        except AttributeError:
            pass
        return avatar

Идея в том, чтобы позволить пользователям загружать только изображения определенного размера, поэтому у меня нет чтобы изменить размер изображения профиля

models.py:

class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)
...
class Mentor(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    linkedin = models.URLField(max_length=200,null=True,blank=True)
    photo = models.ImageField(null=True,blank=True,upload_to='media')

    def __str__(self):
        return "Profile of user {}".format(self.user.username)

views.py (teacher.py):

# edit mentor profile
def edit_user(request):
    user = request.user
    form = MentorProfileForm(instance=user)
    if request.method == 'POST':
        form = MentorProfileForm(request.POST or None, instance=user)
        if form.is_valid():
            ...
            user.email = form.cleaned_data['email']
            user.mentor.avatar = form.cleaned_data['avatar']
            form.save(commit=True)
            return HttpResponseRedirect('%s' % (reverse('profile')))
        else:
            return render(request, 'classroom/teachers/app-instructor-profile.html', {'form': form,
                                                                                      'errors': form.errors})
    return render(request, 'classroom/teachers/app-instructor-profile.html', {'form': form})

и моя html страница:

<form id="edit-mentor-profile" class="form-horizontal" method="post" enctype="multipart/form-data">
                        {% csrf_token %}
                      <div class="form-group">
                        <label for="photo" class="col-sm-2 control-label">Avatar</label>
                        <div class="col-md-6">
                          <div class="media v-middle">
                            <div class="media-left">
                              <div class="icon-block width-100 bg-grey-100">
                                  <img id="image" style="width:99%;height:99%;">
                              </div>
                            </div>
                            <div class="media-body">
                                <input type="file" id="files" class="btn btn-white btn-sm paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated/>
                            </div>
...

Здесь должно отображаться изображение профиля

<img src="{{ user.mentor.avatar}}" alt="people" class="img-circle width-80" />

Проблема заключается в том, что при нажатии кнопки сохранить изменения я не обновляю изображение профиля (все остальное обновляется)

Обновление

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

Затем я сохраняю обе формы в моем views.py, когда они редактируются, но теперь ничего не Сохранено

Вот что у меня есть в views.py (teacher.py):

# edit mentor profile
def edit_user(request):
    user = request.user
    # form = MentorProfileForm(instance=user)
    if request.method == 'POST':
        form = UserForm(request.POST, instance=user)
        mentorform = MentorProfileForm(request.POST, request.FILES, instance=user)
        if form.is_valid() and mentorform.is_valid():
            form.save()
            mentorform.save()
            messages.success(request, _('Your profile was successfully updated!'))
            return HttpResponseRedirect('%s' % (reverse('profile')))
        else:
            messages.error(request, _('Please correct the error below.'))
    else:
        form = UserForm(request.POST, instance=user)
        mentorform = MentorProfileForm(request.POST, request.FILES, instance=user)
    return render(request, 'classroom/teachers/app-instructor-profile.html', {'form': form,
                                                                              'mentor_form': mentorform})

forms.py:

#basic form
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name','last_name','email')

# edit mentor profile
class MentorProfileForm(forms.ModelForm):
    class Meta:
        model = Mentor
        fields = ('photo',)

форма для редактирования информация о фото и профиле:

<form id="edit-mentor-profile" class="form-horizontal" method="post" enctype="multipart/form-data">
                    {% csrf_token %}
                  <div class="form-group">
                    <label for="photo" class="col-sm-2 control-label">Avatar</label>
                    <div class="col-md-6">
                      <div class="media v-middle">
                        <div class="media-left">
                          <div class="icon-block width-100 bg-grey-100">
                              <img id="image" style="width:99%;height:99%;">
                          </div>
                        </div>
                        <div class="media-body">
                            <input type="file" id="files" class="btn btn-white btn-sm paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated/>
                        </div>
                      </div>
                    </div>
                  </div>
                  <div class="form-group">
                    <label for="inputEmail3" class="col-md-2 control-label">Full Name</label>
                    <div class="col-md-8">
                      <div class="row">
                        <div class="col-md-6">
                          <div class="form-control-material">
                            {{ form.first_name }}
                            <label for="edit-mentor-profile-first_name"></label>
                          </div>
                        </div>
                        <div class="col-md-6">
                          <div class="form-control-material">
                            {{ form.last_name }}
                            <label for="edit-mentor-profile-last_name"></label>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                  <div class="form-group">
                    <label for="email" class="col-md-2 control-label">Email</label>
                    <div class="col-md-6">
                      <div class="form-control-material">
                        <div class="input-group">
                          <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
                          {{ form.email }}
                          <label for="edit-mentor-profile-email"></label>
                        </div>
                      </div>
                    </div>
                  </div>
                  <div class="form-group">
                    <div class="col-md-offset-2 col-md-6">
                      <div class="checkbox checkbox-success">
                        <input id="checkbox3" type="checkbox" checked="">
                        <label for="checkbox3">Subscribe to our Newsletter</label>
                      </div>
                    </div>
                  </div>
                  <div class="form-group margin-none">
                    <div class="col-md-offset-2 col-md-10">
                      <button type="submit" class="btn btn-primary paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated>Save Changes</button>
                    </div>
                  </div>
                </form>

и место, где должна появиться фотография

  <img src="{{ mentorform.photo}}" alt="people" class="img-circle width-80" />

При таком обновленном подходе я получаю сообщение об ошибке

messages.success(request, _('Your profile was successfully updated!')) NameError: name '_' is not defined

1 Ответ

0 голосов
/ 08 января 2020

Обратите внимание, что необходимо сохранить объект, прежде чем он может быть назначен для отношения один-к-одному, применяется к обновлениям, в teachers.py сохранить экземпляр после назначения аватара.

mentor = user.mentor
mentor.avatar = form.cleaned_data['avatar']
mentor.save()
user.save()

и передайте ФАЙЛ из запроса в форму.

form = MentorProfileForm(request.POST, request.FILES, instance=user)
...