Проблема с Django Forms и моделями (Введите правильный URL.)
Моя идея состоит в том, чтобы получить изображение от пользователя с помощью формы (оно может быть локальным на его компьютере) и после отправки формы система загружает его в imgBB. Проблема в том, что форма не действительна, потому что в ней написано «Введите действительный URL.».
class FeriaForm(forms.ModelForm):
#... Others fields
image = forms.URLField(
label="",
widget=forms.ClearableFileInput(attrs={'class': 'form-input'})
)
class Meta:
model = JobFair
fields = [
'title', 'description', 'start_event_date',
'end_event_date', 'start_hour', 'end_hour',
'department', 'city', 'direction',
'maximum_capacity', 'is_visible',
'keynote_speaker', 'image'
]
Эта модель JobFair
class JobFair(models.Model):
organizer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='job_fairs', null=True)
title = models.CharField(max_length=255)
description = models.TextField()
start_event_date = models.DateField()
end_event_date = models.DateField(null=True)
department = models.CharField(max_length=255)
city = models.CharField(max_length=255)
start_hour = models.TimeField(auto_now=False, auto_now_add=False)
end_hour = models.TimeField(auto_now=False, auto_now_add=False, null=True)
maximum_capacity = models.IntegerField(null=True)
number_of_registered = models.IntegerField(default=0, null=True)
is_visible = models.BooleanField(default=True)
direction = models.CharField(max_length=255)
keynote_speaker = models.CharField(max_length=255)
image = models.URLField(blank=True, null=True)
и этот вид, где я использовал форму.
def add_fair_view(request):
if request.method == 'POST':
form = FeriaForm(request.POST, request.FILES) # Manejar datos y archivos
if form.is_valid():
image_file = request.FILES.get('image') # Obtener el archivo de la imagen
# Subir el archivo a ImgBB
try:
response = requests.post(
IMGBB_API_URL,
data={'key': config('IMGBB_API_KEY')},
files={
'image': (image_file.name, image_file.file, image_file.content_type)
}
)
response_data = response.json()
if response.status_code == 200:
# Obtener la URL de la imagen subida
img_url = response_data['data']['url']
# Guardar la feria en la base de datos
fair = form.save(commit=False) # No guardar todavía
fair.organizer = request.user
fair.image = img_url # Asignar la URL
fair.save() # Guardar en la base de datos
return redirect('view_fairs')
else:
# Error al subir a ImgBB
form.add_error('image', f"Error al subir la imagen: {response_data.get('error', {}).get('message', 'Desconocido')}")
except requests.RequestException as e:
# Error al realizar la solicitud a ImgBB
form.add_error('image', f"Error al subir la imagen: {str(e)}")
else:
form = FeriaForm()
return render(request, 'addfair.html', {'form': form})
Я попробовал изменить изображение как image = forms.ImageField(...)
, но когда я это сделал, он говорит «No file was summited/ check the enctype». HTML-форма имеет настроенный enctype. Я действительно не знаю, что делать. Буду благодарен за любую помощь.
Проблема в том, что для загрузки изображения вы используете forms.URLField
, который ожидает URL. Вместо этого следует использовать forms.ImageField
, чтобы правильно обрабатывать загрузку файлов.
image = forms.ImageField(
label="",
widget=forms.ClearableFileInput(attrs={'class': 'form-input'})
)
Выполнив эту настройку, ваша форма сможет корректно обрабатывать загрузку изображений. Надеюсь, это поможет! Спасибо, и удачи! ✨