'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(),

И все будет работать

→ Ссылка