我正在关注Wagtail文档到customize the user model。我想将图像添加到用户模型。
Django版本:2.0.8, 版本:2.1
问题
使用图像选择器字段选择图像并单击“保存”后,出现此错误:
'未提交任何文件。检查表单上的编码类型。'
代码
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
display_image = models.ForeignKey('wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+')
forms.py
from django import forms
from django.utils.translation import ugettext_lazy as _
from wagtail.users.forms import UserEditForm, UserCreationForm
from wagtail.images.widgets import AdminImageChooser
class CustomUserEditForm(UserEditForm):
display_image = forms.ImageField(
widget=AdminImageChooser(), label=_('Autorenbild'))
class CustomUserCreationForm(UserCreationForm):
display_image = forms.ImageField(
widget=AdminImageChooser(), label=_('Autorenbild'))}
edit.html
{% extends "wagtailusers/users/edit.html" %}
{% block extra_fields %}
{% include "wagtailadmin/shared/field_as_li.html" with field=form.display_image %}
{% endblock extra_fields %}
{% block extra_js %}
{{ block.super }}
{% include 'wagtailadmin/pages/_editor_js.html' %}
{% endblock extra_js %}
create.html类似
到目前为止我尝试过的事情
我发现here使用AdminImageChooser
小部件的想法。我必须通过添加一个forms.ImageField
来调整表单,以便 User 页面能够正确显示。
问题
任何人都知道为什么会发生错误以及如何解决该错误?
如上面的Google组线程中所述,将图像添加到用户模型似乎有点“尴尬”。将图像连接到用户以在站点中重复使用的更好方法是什么?要求是可以在Wagtail管理员中轻松更改图像。
Wagtail 2.2版的其他问题
在管理界面的“设置”>“用户”中,AdminImageChooser
的窗口未打开。
控制台显示以下JS错误:
未捕获的ReferenceError:未定义createImageChooser
答案 0 :(得分:0)
在使用相同Google组线程中最后提出的解决方案时,从Wagtail 2.1升级到2.2后也遇到了ReferenceError: createImageChooser is not defined
js问题
这是我的研究方向:
看起来像this commit删除了_editor_js.html中直接包含媒体js的内容。
好的,因此解决方案是复制旧行为并访问Media subclasses of widgets
首先,我尝试将相同的已删除行添加到{% block extra_js %}
中我自己的edit.html中。不工作。
看起来像某些视图会返回edit_handler
,例如here。用户视图没有。
在创建和编辑视图中,用户视图确实提供的是form variable。让我们使用它。
对我来说,最终的解决方案是像这样更改edit.html中的extra_js块:
{% block extra_js %}
{{ block.super }}
{% include 'wagtailadmin/pages/_editor_js.html' %}
{{ form.media.js }}
{% endblock extra_js %}
答案 1 :(得分:0)
class User(AbstractUser):
first_name = models.CharField(max_length=40, blank=False)
image = models.ImageField(blank=False, null=False, upload_to='image/', default='img/user.jpg')
def __str__(self):
return self.username
'''''在这里您还可以添加模型及其要求,您可以设置路径以记住图像文件夹将在媒体文件夹中创建的一件事。因此请不要忘记在该文件夹中添加该文件夹。就像您觉得有帮助一样'''
class UserRegistrationForm(forms.ModelForm):
confirm_password2 = forms.CharField(widget=forms.PasswordInput,required=False)
class Meta:
model = User
fields = ['first_name','username','password','confirm_password2','image']
def clean(self):
cleaned_data = super(UserRegistrationForm, self).clean()
password = cleaned_data.get("password")
confirm_password2 = cleaned_data.get("confirm_password2")
if password != confirm_password2:
self.add_error('confirm_password2', "Password does not match")
return cleaned_data
'''def clean进行密码验证,我直接在其中添加了我想要的字段'''
def Register_view(request):
form = UserRegistrationForm()
if request.method == 'POST':
form = UserRegistrationForm(request.POST, request.FILES)
if form.is_valid():
user = form.save(commit=False)
password = form.cleaned_data.get("password")
user.set_password(password)
user.save()
return redirect('login')
return render(request, 'register.html', {'form': form})
'''使用request.files在表单中添加图像'''
<form action="{% url 'register' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="body bg-gray">
<div class="form-group">
{{ form.as_p }}
</div>
</div>
<div class="footer">
<button type="submit" class="btn bg-olive btn-block">Sign me up</button>
<a href="{% url 'login' %}" class="text-center">I already have Account</a>
</div>
</form>
'''用户多部分,以在其中添加图像'''
答案 2 :(得分:0)
在Django 3.0.7和wagtail wagtail 2.9上,我可以这样解决:
models.py
class User(AbstractUser):
avatar = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+'
)
forms.py
使用 ModelChoiceField 和非ImageField 很重要,因此您必须与AdminImageChooser小部件兼容。
from django import forms
from wagtail.images import get_image_model
from wagtail.images.widgets import AdminImageChooser
from wagtail.users.forms import UserCreationForm, UserEditForm
class CustomUserEditForm(UserEditForm):
avatar = forms.ModelChoiceField(
queryset=get_image_model().objects.all(), widget=AdminImageChooser(),
)
class CustomUserCreationForm(UserCreationForm):
avatar = forms.ModelChoiceField(
queryset=get_image_model().objects.all(), widget=AdminImageChooser(),
)
模板
无需手动加载任何Javascript。小部件会为您完成。
Any-templates-dir / wagtailusers / users / create.html
{% extends "wagtailusers/users/create.html" %}
{% block extra_fields %}
{% include "wagtailadmin/shared/field_as_li.html" with field=form.avatar %}
{% endblock extra_fields %}
Any-templates-dir / wagtailusers / users / edit.html
{% extends "wagtailusers/users/edit.html" %}
{% block extra_fields %}
{% include "wagtailadmin/shared/field_as_li.html" with field=form.avatar %}
{% endblock extra_fields %}