Не обновлять фотографию профиля в Django - PullRequest
0 голосов
/ 09 января 2020

Это немного повторения предыдущего вопроса, который я задавал. Тем не менее, я считаю, что я внес достаточно существенные изменения в код, чтобы не задавать новый вопрос при получении нового сообщения об ошибке.

Это мой код в 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',)

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)

@receiver(post_save,sender=User)
def create_or_update(sender, instance,created, **kwargs):
    if created:
        post_save.connect(create_or_update, sender=User)

форма 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/>
...

и это где изображение должно появиться

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

urls.py:

path('teachers/', include(([
    path('', teachers.QuizListView.as_view(), name='app-instructor-dashboard'),
    path('logout', teachers.logout_request, name="logout"),
    path('edit_user', teachers.edit_user, name='edit_user'),
], 'classroom'), namespace='teachers'))
...
#user profile image
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Здесь я добавил URL-адрес мультимедиа в settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Примечание. Я редактировал Httpredirect для перенаправления для редактирования пользователя, но все еще не может обновить изображение профиля

return HttpResponseRedirect('%s' % (reverse('teachers:edit_user')))

UPDATE

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

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

<img src=(unknown) alt="people" class="img-circle width-80">

Я заметил, что я не создал папку мультимедиа, поэтому я создал вручную Он все еще не обновляет мою фотографию. Может быть проблема в том, что я вызываю картинку в html?

Ответы [ 2 ]

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

у вас есть пространство имен учителей в ваших настройках URL, поэтому при вызове URL добавьте также пространство имен.

return HttpResponseRedirect('%s' % (reverse('teachers:profile')))
0 голосов
/ 09 января 2020

Добавьте это к своим models.py:

def mentor_photos(instance, filename):
    return 'mentor/photos/%s' % filename

class Mentor(models.Model):
    ...
    models.ImageField(null=True, blank=True, upload_to=mentor_photos)  # <-- Note the upload_to change
...