Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在注册表中添加图像上传选项?_Python_Django_Django Models_Django Forms_Django Templates - Fatal编程技术网

Python 如何在注册表中添加图像上传选项?

Python 如何在注册表中添加图像上传选项?,python,django,django-models,django-forms,django-templates,Python,Django,Django Models,Django Forms,Django Templates,我的forms.py就是这个 from django import forms from django.contrib.auth.models import User from django.contrib.auth.forms import UserCreationForm,UserChangeForm class RegistrationForm(UserCreationForm): email= forms.EmailField(required = True) cla

我的forms.py就是这个

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm,UserChangeForm

class RegistrationForm(UserCreationForm):
    email= forms.EmailField(required = True)

    class Meta:
        model = User
        fields = {
            'username',
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2'
        }

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

而且,我必须为用户添加上载图像选项,以便用户可以从任何文件上载图像并将其加载到配置文件中。

您必须使用字段profile_image=models.FileField扩展您的用户模型

比你要加的还要多

class RegistrationForm(UserCreationForm):
    email= forms.EmailField(required = True)
    profile_image = forms.FileField() # add this field

    ...

    def save(self, commit=True):
        ...
        user.profile_image = self.cleaned_data.get('profile_image')
        ...
并将enctype=multipart/formdata属性添加到html模板中的标记中。这里是Django docs上的教程

编辑

在不更改实际用户模型的情况下,以最基本的方式扩展用户模型,就是创建与用户模型具有一对一关系的新模型

from django.conf import settings

class Profile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

    profile_image = models.FileField() # where is stored the user profile image
这是每个用户的配置文件。创建用户时,您必须创建配置文件,因此:

将此代码放在any models.py或使用django启动时加载的文件中

from django.contrib import auth
auth.models.User.add_to_class('create_profile', create_profile)
然后创建下面的方法

from (appname).models import Profile

def create_profile(self, **kwargs):
    Profile.objects.create(
        user=self,
        **kwargs # you can pass other fields values upon creating
    )
然后像我之前写的那样修改注册表单并修改save函数

def save(self, commit=True):
    user = super(RegistrationForm, self).save(commit=False)
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']
    user.email = self.cleaned_data['email']

    # user has to be saved to add profile
    user.save()
    user.create_profile() 
    user.profile_img = self.cleaned_data.get('profile_image')
    user.profile.save()

    if commit:
        user.save()
同样,当您使用request.POST实例化注册表单时,也可以这样做

form = RegistrationForm(request.POST, request.FILES)
# to the files have to be passed also, they are not in request.POST
if form.is_valid():
    form.save()

就是这样。

你能帮我完成用字段profile扩展用户模型的完整过程吗?\u image=models.FileField我拿不到那些教程。我会更新我的答案,几分钟后再查看。