Django 表单和模型的问题(输入有效的 URL。)

问题描述 投票:0回答:1

我的想法是使用表单从用户那里获取一个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 配置。我真的不知道该怎么办。我感谢任何形式的帮助。

django django-models django-views django-forms
1个回答
0
投票

问题是您正在使用

forms.URLField
(它需要 URL)来上传图像。相反,您应该使用
forms.ImageField
来正确处理文件上传。

image = forms.ImageField(
    label="",
    widget=forms.ClearableFileInput(attrs={'class': 'form-input'})
)

通过进行此调整,您的表单将能够正确处理图像上传。我希望这有帮助!谢谢你,祝你好运! ✨

© www.soinside.com 2019 - 2024. All rights reserved.