#html #django #database #sqlite #django-forms
Вопрос:
Я пытаюсь сохранить данные в базу данных с веб-сайта. Моя веб-страница принимает данные (изображение из моей системы), но в базе данных они не отображаются. Если я добавлю вручную, то это создаст новую запись пользователя и сохранит ее. Вот мои файлы:
models.py
class Details(models.Model):
name = models.CharField(max_length=122)
username = models.CharField(max_length=122)
email = models.EmailField(max_length=122)
password = models.CharField(max_length=20)
def __str__(self):
return self.name
class Image_Data(models.Model):
img_User = models.ForeignKey(
Details, blank=True, null=True, on_delete=models.CASCADE)
img_password = models.ImageField(null=True, blank=True)
def __str__(self):
return str(self.img_password)
forms.py
class ImageForm(ModelForm):
class Meta:
model = Image_Data
fields = ('img_password',)
labels = {
'img_password': 'Add your image ',
}
widgets = {
'img_password': forms.FileInput(attrs={'class': 'form-control', 'placeholder': 'Upload from device'})
}
views.py
def register_new_b(request):
saved = False
if request.method == "POST":
# take whatever is posted to the Details Form
form = ImageForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, 'Your message has been sent!')
return HttpResponseRedirect('/register_new_b?saved=True')
else:
form = ImageForm()
if 'saved' in request.GET: # sends saved var in GET request
saved = True
return render(request, 'register2.html', {'form': form, 'saved': saved})
Ответ №1:
В очереди:
form = ImageForm(request.POST)
вам нужно добавить запрос.Файлы:
form = ImageForm(request.POST, request.FILES)
*Редактировать
Рабочий пример в моем собственном коде: в views.py
def change_profile_pic(request):
context = dict()
if request.method == 'POST':
form = ProfilePictureForm(request.POST, request.FILES)
if form.is_valid():
form.store(request.user.id)
form = ProfilePictureForm()
context['success_message'] = 'Picture changed'
request.user.employee.refresh_from_db()
else:
context['error_message'] = 'Unable to change picture'
else:
form = ProfilePictureForm()
context['form'] = form
return render(request, 'template.html', context)
в forms.py
class ProfilePictureForm(forms.Form):
image = forms.ImageField(required=True)
def store(self, user_id):
user = User.objects.get(id=user_id)
user.employee.profile_picture = self.cleaned_data['image']
user.employee.save()
в models.py
class Employee(models.Model):
user = models.OneToOneField(User, blank=False, on_delete=models.CASCADE)
profile_picture = models.ImageField(upload_to='profile_pictures', max_length=200, null=True, blank=True)
Но я также экспериментировал с моделью, и это также правильно сохраняет файл
Комментарии:
1. я попробовал это. Но все еще не отображается имя изображения в базе данных
2. Оглядываясь назад (после моего редактирования), я вижу, что вам не хватает
upload_to
поля изображения, а не толькоrequest.FILES
инициализации формы3. Я попытался добавить в ваш код функцию, аналогичную функции store (). Это выдает ошибку : объект ImageForm’ не имеет атрибута ‘store’
4. В соответствии с моим примером, я создал эту функцию сам и не являюсь стандартной функцией формы