#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 спасибо за ваш комментарий, я кое-что понял, но, похоже, это не работает идеально, пожалуйста, посмотрите последнюю часть моего вопроса, которую я отредактировал и предоставил скриншот