Можете ли вы заставить выпадающее окно формы Django принимать модель в качестве вариантов выбора?
У меня есть сайт недвижимости, где я пытаюсь иметь возможность загружать несколько фотографий к одной "собственности", не проходя через панель администратора django (чтобы я мог выбирать несколько фотографий)
Текущий вид для пользовательской формы
Я могу выбрать несколько файлов, загрузить их в папку 'uploads' и могу видеть их в панели администратора для баз данных. Проблема в том, что имя свойства из формы, которую я создал, не связывает объект Property с объектами Property Photos. Это просто нулевое значение. Когда я нажимаю на объект Property Photo, только тогда он присваивает ему объект Property.
Свойство Фото объект Как только я нажимаю на него и нажимаю сохранить
Как мне получить возможность выбрать (с помощью выпадающего списка) объект недвижимости из всех моих объектов недвижимости в виде списка и назначить загруженные фотографии этому объекту недвижимости?
Ниже приведены мои: html форма, models.py, views.py и forms.py
photo_upload.html
<body>
<form action=""
method="POST"
enctype="multipart/form-data">
{% csrf_token %}
<div class="fs-1">Photo Upload</div>
{{ image_form }}
<button>Upload</button>
</form>
</body>
models.py
class Property(models.Model):
class Meta:
verbose_name_plural = 'Properties'
address = models.CharField(max_length=150)
slug = models.SlugField(unique=True, )
date = models.DateField(auto_now=True)
listing_status = models.ForeignKey(ListingStatus,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='property')
css_file = models.ForeignKey(CssFile,
on_delete=models.SET_NULL,
null=True,
related_name='property')
agent = models.ForeignKey(Agent,
on_delete=models.SET_NULL,
null=True,
related_name='property')
def __str__(self):
return self.address
class PropPhoto(models.Model):
class Meta:
verbose_name_plural = 'Property Photos'
property_name = models.ForeignKey(Property,
on_delete=models.CASCADE,
null=True,
default='',
related_name='property')
prop_photo = models.ImageField(upload_to='property_photos',
default='', )
views.py
def images_upload(request):
if request.method == 'POST':
image_form = ImageUploadsForm(request.POST, request.FILES)
if image_form.is_valid():
images = request.FILES.getlist('prop_photo')
for img in images:
photo = PropPhoto.objects.create(prop_photo=img,)
return HttpResponseRedirect('thanks/')
else:
image_form = ImageUploadsForm()
return render(request, 'personal_property_site/photo_upload.html', {
'image_form': image_form,
})
forms.py
address_list = []
for prop in Property.objects.all():
address_list.insert(1, (prop.slug, prop.slug))
address_list.reverse()
class ImageUploadsForm(forms.Form):
property_name = forms.CharField(label='Property Name',
required=True,
max_length=250,
widget=forms.Select(
attrs={
'class': 'form-control',
},
choices=address_list, #this is what to change
))
prop_photo = forms.FileField(label='Upload property photos',
required=True,
widget=forms.ClearableFileInput(
attrs={
'class': 'form-control',
'multiple': True,
},
))
В этой строке нужно присвоить свойство
photo = PropPhoto.objects.create(prop_photo=img,)
Сначала получите свойство, которое вы хотите присвоить фотографии property = Property.objects.get(-вставьте здесь что угодно для идентификации свойства-)
Тогда:
photo = PropPhoto.objects.create(prop_photo=img,property_name = property)