'ImageField' object has no attribute 'use_required_attribute'
я новичок в django, поэтому просто попытался создать и отправить форму.
forms.py:
from .models import publication
from django.forms import ModelForm, TextInput, Textarea, FileInput, ImageField, Select
class publicationform(ModelForm):
class Meta:
model = publication
fields = ['title', 'text', 'images', 'files', 'category']
widgets = {
'title': TextInput(attrs={
'class': 'form-control',
'placeholder': 'Название'
}),
'text': Textarea(attrs={
'class': 'form-control',
'placeholder': 'Текст'
}),
'images': ImageField(),
'files': FileInput(attrs={
'class': 'p_files',
'placeholder': 'Файлы'
}),
'category': Select(attrs={
'class': 'form-select',
'placeholder': 'Категория'
})
}
models.py:
from django.db import models
# Create your models here.
class publication(models.Model):
title = models.CharField('Заголовок', max_length = 50, blank = False, help_text = 'Введите
заголовок (обязательно)')
text = models.TextField('Содержание', blank = True, help_text = 'Текст статьи (необязательно)')
images = models.ImageField('Изображения', blank = True, help_text = 'Прикрепите изображения (необязательно)')
files = models.FileField('Файлы', blank = True, help_text = 'Дополните публикацию файлами (необязательно)')
category = models.CharField('Каегория', max_length = 60, choices = [('new', 'объявление'),('post', 'запись')],blank = False, help_text = 'Выберите категорию (обязательно)')
def __str__(self):
return self.title
class Meta:
ordering = ['title']
verbose_name = 'Пост'
verbose_name_plural = 'Посты'
views.py:
from django.shortcuts import render, redirect
from django.template import Context, loader
from django.core.mail import send_mail
from django.http import HttpResponse
from .forms import publicationform
from .models import publication
# Create your views here.
def index(request):
#return render(request, 'main/index.html', {'title': 'О НАС'})
return HttpResponse('<h1>index</h1>')
def me(request):
#return render(request, 'main/me.html', {'title': 'Я'})
return HttpResponse('<h1>me</h1>')
def news(request):
#return render(request, 'main/news.html', {'n': publication.objects.order_by('-id'), 'title':
'ЖИЗНЬ ЛИЦЕЯ'})
return HttpResponse('<h1>news</h1>')
def createpost(request):
error = ''
if request.method == 'POST':
form = publicationform(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('about')
else:
error = 'Неверная форма'
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
if cc_myself:
recipients.append(sender)
else:
form = publicationform()
return render(request, 'main/create.html', {'title': 'Новый пост', 'form': publicationform()})
def createtask(request):
return HttpResponse('<h1>createtask</h1>')
def timetable(request):
return HttpResponse('<h1>timetable</h1>')
def dairy(request):
return HttpResponse('<h1>dairy</h1>')
'''def error404(request):
return HttpResponse('<h1>error</h1>')'''
html формы:
{% extends 'main/base.html' %}
{% block title %}{{ title }}{% endblock %}
{% block header %}
{% endblock %}
{% block body %}
<div style="width: 500px; margin-left: 400px; margin-top: 100px;">
<form method="post" action="">
{% csrf_token %}
{{ form.title }}<br>
{{ form.text }}<br>
{{ form.images }}<br>
{{ form.files }}<br><br>
{{ form.category }}<br>
<button type="submit" class="btn btn-success">Добавить</button>
</form>
</div>
<span>{{ error }}</span>
{% endblock %}
фул ошибки:
Internal Server Error: /newpost
Traceback (most recent call last):
File "d:\soft\git\django\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "d:\soft\git\django\django\core\handlers\base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\yasol\OneDrive\Документы\projects\program
languages\python\django\liceum\main\views.py", line 4
in createpost
return render(request, 'main/create.html', {'title': 'Новый пост', 'form': publicationform()})
File "d:\soft\git\django\django\shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "d:\soft\git\django\django\template\loader.py", line 62, in render_to_string
return template.render(context, request)
File "d:\soft\git\django\django\template\backends\django.py", line 61, in render
return self.template.render(context)
File "d:\soft\git\django\django\template\base.py", line 170, in render
return self._render(context)
File "d:\soft\git\django\django\template\base.py", line 162, in _render
return self.nodelist.render(context)
File "d:\soft\git\django\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "d:\soft\git\django\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "d:\soft\git\django\django\template\loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "d:\soft\git\django\django\template\base.py", line 162, in _render
return self.nodelist.render(context)
File "d:\soft\git\django\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "d:\soft\git\django\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "d:\soft\git\django\django\template\loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "d:\soft\git\django\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "d:\soft\git\django\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "d:\soft\git\django\django\template\base.py", line 994, in render
return render_value_in_context(output, context)
File "d:\soft\git\django\django\template\base.py", line 973, in render_value_in_context
value = str(value)
File "d:\soft\git\django\django\utils\html.py", line 376, in <lambda>
klass.__str__ = lambda self: mark_safe(klass_str(self))
File "d:\soft\git\django\django\forms\boundfield.py", line 34, in __str__
return self.as_widget()
File "d:\soft\git\django\django\forms\boundfield.py", line 90, in as_widget
attrs = self.build_widget_attrs(attrs, widget)
File "d:\soft\git\django\django\forms\boundfield.py", line 225, in build_widget_attrs
if widget.use_required_attribute(self.initial) and self.field.required and
self.form.use_required_attribute:
AttributeError: 'ImageField' object has no attribute 'use_required_attribute'
[29/Jan/2021 23:29:20] "GET /newpost HTTP/1.1" 500 160478
Ответы (1 шт):
Автор решения: Александр
→ Ссылка
Ошибка возникает из-за того, что вы назначаете тип, не являющийся виджетом, в качестве виджета.
ImageField - это тип поля формы. В качестве виджета по умолчанию он использует ClearableFileInput. Вероятно, последний вам и нужен, если вы хотите по какой-либо причине переопределить его поведение по умолчанию:
'images': ClearableFileInput(),
Однако, вы используете ModelForm, и использование этого виджета уже предопределено для типа models.ImageField, так что в том случае, если вас устраивает поведение по умолчанию, вы можете смело удалить строчку:
'images': ImageField(),
И все будет работать