Как отображать изображения в анкете 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' %}">
Попробуйте выполнить следующие действия по порядку:
Убедитесь, что
django.contrib.staticfiles
включен в ваш INSTALLED_APPS.В вашем файле настроек определите STATIC_URL:
STATIC_URL = '/static/'
В вашем файле шаблона
{% load static %} <img src="{% static 'mysurveys/female_irritated.png' %}" alt="image alt">
Храните статические файлы в папке 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,
})