g:将图像添加到自定义用户模型

时间:2018-08-30 10:30:34

标签: python django wagtail django-custom-user

我正在关注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 页面能够正确显示。

问题

  1. 任何人都知道为什么会发生错误以及如何解决该错误?

  2. 如上面的Google组线程中所述,将图像添加到用户模型似乎有点“尴尬”。将图像连接到用户以在站点中重复使用的更好方法是什么?要求是可以在Wagtail管理员中轻松更改图像。

Wagtail 2.2版的其他问题

在管理界面的“设置”>“用户”中,AdminImageChooser的窗口未打开。

控制台显示以下JS错误:

未捕获的ReferenceError:未定义createImageChooser

3 个答案:

答案 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)

models.py

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

'''''在这里您还可以添加模型及其要求,您可以设置路径以记住图像文件夹将在媒体文件夹中创建的一件事。因此请不要忘记在该文件夹中添加该文件夹。就像您觉得有帮助一样'''

forms.py

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进行密码验证,我直接在其中添加了我想要的字段'''

views.py

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在表单中添加图像'''

register.html

         <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 %}