我的想法是使用表单从用户那里获取一个img(它可以在她的计算机上本地),并在表单发送后系统将其上传到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(...)
,但是当我这样做时,它说“没有文件被峰会/检查enctype”。 HTML 表单具有 enctype 配置。我真的不知道该怎么办。我感谢任何形式的帮助。
问题是您正在使用
forms.URLField
(它需要 URL)来上传图像。相反,您应该使用 forms.ImageField
来正确处理文件上传。
image = forms.ImageField(
label="",
widget=forms.ClearableFileInput(attrs={'class': 'form-input'})
)
通过进行此调整,您的表单将能够正确处理图像上传。我希望这有帮助!谢谢你,祝你好运! ✨