Как отображать изображения в анкете Django

Я работаю над приложением Django, в котором пользователь сможет пройти любой опрос, выбранный им из списка опросов. Для одного из опросов пользователь должен выбрать изображение, которое лучше всего отражает его настроение. Для их ответа мне не нужно записывать выбранное ими изображение, только название настроения, которое оно отражает (например, "веселое"). Поэтому я еще не добавил в модель поле "изображение". Однако пользователь должен иметь возможность увидеть изображение и выбрать его. На данный момент я не могу отобразить изображения, только получаю их названия. Я проверил свой код и все еще не могу найти ошибку. Кстати, я не получаю никаких сообщений о технических ошибках. Любые ваши рекомендации будут приняты с благодарностью. Ниже приведены мои модели, представления и HTML. Прошу прощения за длинные файлы.

Спасибо!

Модели

User = settings.AUTH_USER_MODEL

class Questionnaire(models.Model): 
    name = models.CharField(max_length=255) 
    text = models.CharField(max_length=200)

    def __str__(self):
        return self.name

class Question(models.Model):
    text = models.CharField(max_length=200)
    questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE, related_name='questions')
    def __str__(self):
        return self.text

class Answer(models.Model):
    questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE, related_name='answers', default='')
    text = models.CharField(max_length=200)

    def __str__(self):
        return self.text
 
class Response(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE)  
    date = models.DateTimeField(auto_now_add=True)
    question = models.ForeignKey(Question, on_delete = models.CASCADE)
    answer = models.ForeignKey(Answer, on_delete = models.CASCADE)
    def __str__(self):
        return '%s - %s - %s - %s' % (self.user, self.question, self.answer, self.date)

Виды

from django.forms import ModelForm
class ResponseForm(ModelForm):
    class Meta:
        model = Response
        fields = ['question', 'answer']
        # widgets= {'answer': RadioSelect}
    
    def __init__(self, *args, user=None, **kwargs):
        self.user = user
        super().__init__(*args, **kwargs)

    def save(self, commit=True):
        response = super().save(commit=False)
        response.user = self.user
        return response.save()


def take_questionnaire_fs(request, questionnaire_id):

    ResponseFormSet = modelformset_factory(Response, form=ResponseForm, extra=0)
    if request.method == 'POST':
        formset = ResponseFormSet(request.POST or None, request.FILES, form_kwargs={'user': request.user})
        if formset.is_valid():
            print("Formset is valid")
            formset.save()
            return HttpResponseRedirect(reverse ('questionnaires:questionnaire_index'))
        else:
            print("Formset is NOT valid")
            print(formset.errors)
            print(formset.non_form_errors())

    questions = Question.objects.filter(questionnaire_id=questionnaire_id)
    answers = Answer.objects.filter(questionnaire_id=questionnaire_id)

    return render(request, 'questionnaires/take_questionnaire_fs.html', {
        'questions': questions,
        'answers': answers,
        })

HTML

Вам необходимо использовать статические файлы.

Убедитесь, что он установлен в вашем settings.py, а затем в html load static и используйте его для получения ваших файлов.

Например, если ваши файлы находятся в папке static и это установлено в settings.py

<img src="{% static 'mysurveys/female_irritated.png' %}">

Попробуйте выполнить следующие действия по порядку:

  1. Убедитесь, что django.contrib.staticfiles включен в ваш INSTALLED_APPS.

  2. В вашем файле настроек определите STATIC_URL:

     STATIC_URL = '/static/'
    
  3. В вашем файле шаблона

     {% load static %}
     <img src="{% static 'mysurveys/female_irritated.png' %}" alt="image alt">
    
  4. Храните статические файлы в папке static в вашем приложении. Например, my_app/static/mysurveys/female_bored.png. Как вы уже сделали

Больше информации в Django doc.

Спасибо за предложения! Статические файлы были настроены правильно, ошибка была в том, что мне нужно было добавить поле 'анкета' в представления. Синтаксис теперь следующий:

def take_questionnaire_fs(request, questionnaire_id):

ResponseFormSet = modelformset_factory(Response, form=ResponseForm, extra=0)

if request.method == 'POST':
    formset = ResponseFormSet(request.POST or None, request.FILES, form_kwargs={'user': request.user})
    if formset.is_valid():
        # do something with the formset.cleaned_data
        print("Formset is valid")
        formset.save()
        return HttpResponseRedirect(reverse ('questionnaires:questionnaire_index'))
      
    else:
        print("Formset is NOT valid")
        print(formset.errors)
        print(formset.non_form_errors())
         


questionnaire = Questionnaire.objects.get(id=questionnaire_id)
questions = Question.objects.filter(questionnaire_id=questionnaire_id)
answers = Answer.objects.filter(questionnaire_id=questionnaire_id)



return render(request, 'questionnaires/questionnaire_lec.html', {
    'questions': questions,
    'answers': answers,
    'questionnaire': questionnaire,
    })
Вернуться на верх