Django file_resubmit не работает в представлении шаблонов

#django #forms

Вопрос:

Поэтому у меня возникла проблема, когда для формы, имеющей поле изображения (визуализируется с использованием forms.py в Django) всякий раз, когда возникает ошибка проверки, возможно, из-за пропущенных совпадающих паролей и т. Д. поле изображения очистится.

После некоторого поиска в Google я нашел модуль под названием file_resubmit . Это, кажется, хорошо сработало для многих людей, однако по какой-то причине это не работает для меня…

Документы file_resubmit

Я сделал так, как сказали их документы, но, похоже, это не работает на меня.

Я свой settings.py …

 INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    .
    .
    'file_resubmit',
]


CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
    "file_resubmit": {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        "LOCATION": '/tmp/file_resubmit'
    }
}
 

В моем forms.py…

 from file_resubmit.admin import AdminResubmitImageWidget


class DriverRegisterForm(forms.ModelForm):
    mobile = forms.CharField(min_length=10)
    date_of_birth = forms.DateField(widget=forms.TextInput(attrs={'autocomplete': 'off'}), help_text="You need to be a minimum age of 18 to register with us")
    gender = forms.ChoiceField(choices=[("M","Male"), ("F", "Female")])
    district = forms.ChoiceField(choices=CITY)
    nic_number = forms.CharField(label="NIC number", min_length=10)
    license = forms.ImageField(label="License picture")
    your_picture = forms.ImageField(help_text="A picture of yourself so that we know who you are")

    class Meta:
        model = ProfileDriver
        fields = ('mobile', 'gender', 'district', 'nic_number', 'license', 'date_of_birth', 'your_picture')
        widgets = {
            "license":AdminResubmitImageWidget,
            "your_picture":AdminResubmitImageWidget,
        }
 

И на всякий случай мой models.py..

 class ProfileDriver (models.Model):
    mobile = models.CharField(max_length=13, unique=True)
    date_of_birth = models.DateField(validators=[dob_authorized])
    gender = models.CharField(choices=[("M","Male"), ("F", "Female")], default="M", max_length=6)
    district = models.CharField(choices=CITY, default="CMD", max_length=11)
    nic_number = models.CharField(max_length=13, unique=True)
    license = models.ImageField(upload_to="driverLicense")
    your_picture = models.ImageField(upload_to="driverImages")
    total_income = models.IntegerField(default=0)
    approved = models.BooleanField(default=False)
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)

    def __str__ (self):
        return f"{self.user}"
 

И views.py…

 def driver_register(request):
    if not request.user.username:
        if request.method == "POST":
            form1 = UserRegistrationForm(request.POST)
            form2 = DriverRegisterForm(request.POST, request.FILES)
            if form1.is_valid() and form2.is_valid():
                email = form1.cleaned_data.get("email")
                if not User.objects.filter(email=email).exists():
                    user = form1.save()
                    profile = form2.save()
                    profile.user = user
                    profile.save()
                    return redirect ('login')
                else:
                    messages.warning(request, f"An account under the email {email} already exists. Please sign in!")
        else:
            form1 = UserRegistrationForm()
            form2 = DriverRegisterForm()

        return render(request, 'user/driverRegister.html', {"form1":form1, "form2":form2})

    else:
        email = request.user.email
        messages.warning(request, f"You are already logged in as {email}!")
        return redirect ('home')
 

Я не слишком уверен, почему это не работает, но любая помощь была бы очень признательна.

Спасибо!!

Редактировать

Однажды после внесения таких изменений я получаю это сейчас, когда моя форма получает ошибку проверки. изображение

Здесь сейчас имя файла отображается под кнопкой, но когда я отправляю его, там говорится, что файл недоступен и что мне нужно его добавить.

Ответ №1:

Вы сами объявили поля в форме , т. е. license = forms.ImageField(...) и т. Д. это означает, что форма модели не будет автоматически генерировать это поле, так как это объявленное поле. Следовательно, когда вы определяете виджеты для этих полей в Meta классе, они никогда не будут использоваться.

Вместо этого вы хотите указать виджет в самих полях формы (или не определяете поля формы и позволяете форме генерировать их автоматически):

 class DriverRegisterForm(forms.ModelForm):
    ...
    license = forms.ImageField(label="License picture", widget=AdminResubmitImageWidget())
    your_picture = forms.ImageField(help_text="A picture of yourself so that we know who you are", widget=AdminResubmitImageWidget())
    ...
    
    class Meta:
        model = ProfileDriver
        fields = ('mobile', 'gender', 'district', 'nic_number', 'license', 'date_of_birth', 'your_picture')
        # Don't define widgets here
 

Комментарии:

1. Эй @AbdulAzizBarkat спасибо за ваш комментарий, я кое-что понял, но, похоже, это не работает идеально, пожалуйста, посмотрите последнюю часть моего вопроса, которую я отредактировал и предоставил скриншот