【问题标题】:Edit user profiles form without using django admin在不使用 django admin 的情况下编辑用户配置文件表单
【发布时间】:2014-05-01 00:45:20
【问题描述】:

我正在开发一个简单的 LMS 系统,其中有 3 个利益相关者管理员、教职员工和学生。管理员可以创建、编辑、删除、阻止和列出用户帐户,到目前为止,我的开发能够创建和列出所有用户。

现在我被困在编辑用户个人资料上,我的要求是当我点击任何列出的用户时,它应该在表单中打开我的扩展/自定义用户个人资料,并且我应该能够编辑任何打开的用户个人资料。

下面是我的代码sn-ps:

模型.PY:

from django.contrib.auth.models import User
class UserInformation(models.Model):
    user = models.ForeignKey(User, unique=True)
    degree = models.ForeignKey(Degree, null=True, blank=True)
    stakeholder = models.ForeignKey(Stakeholder)
    cell_number = models.CharField(max_length=32, null=True, blank=True)

    def __str__(self):
        return self.user.username

VIEWS.PY(创建用户):

def ad_create_user(request):
    if request.method == 'POST':
        firstname = request.POST['firstname']
        lastname = request.POST['lastname']
        username = request.POST['username']
        password = request.POST['password']
        email = request.POST['email']
        group = request.POST['group']
        degree = request.POST['degree']
        cell_no = request.POST['cell_no']
        new_user = User.objects.create_user(username, email, password)
        new_user.first_name = firstname
        new_user.last_name = lastname
        new_user.save()

        if group == 'option_one':
            set_group = 3
            new_user.groups.add(3)
            userinfo = UserInformation(user=User.objects.get(username=username), degree=Degree.objects.get(pk=degree),
                                       stakeholder=Stakeholder.objects.get(pk=set_group), cell_number=cell_no)
            userinfo.save()
        if group == 'option_two':
            set_group = 2
            new_user.groups.add(2)
            userinfo = UserInformation(user=User.objects.get(username=username),
                                       stakeholder=Stakeholder.objects.get(pk=set_group), cell_number=cell_no)
            userinfo.save()
        if group == 'option_three':
            set_group = 1
            new_user.groups.add(1)
            userinfo = UserInformation(user=User.objects.get(username=username),
                                       stakeholder=Stakeholder.objects.get(pk=set_group), cell_number=cell_no)
            userinfo.save()
        return HttpResponseRedirect('/administrator/user_management/')
    return render(request, 'MobiApp/create_user.html', {'form': CreateUserForm()})

FORMS.PY(创建用户):

class CreateUserForm(forms.Form):
    firstname = forms.CharField(max_length=64)
    lastname = forms.CharField(max_length=64)
    username = forms.CharField(max_length=16)
    password = forms.CharField(
        widget=forms.PasswordInput(),
    )
    email = forms.EmailField()
    group = forms.ChoiceField(
        choices=(
            ('option_one', "Student"),
            ('option_two', "Faculty Member"),
            ('option_three', "Administrator"),
        ),
        widget = forms.RadioSelect,
        initial = 'option_one',
    )
    degree = forms.ModelChoiceField(queryset=Degree.objects.all())
    cell_no = forms.CharField()

    helper = FormHelper()
    helper.form_class = 'form-horizontal'
    helper.layout = Layout(
        Field('firstname', css_class='input-xlarge'),
        Field('lastname', css_class='input-xlarge'),
        Field('username', css_class='input-xlarge'),
        Field('password', css_class='input-xlarge'),
        Field('email', css_class='input-xlarge'),
        'group',
        'degree',
        Field('cell_no', css_class='input-xlarge'),
        FormActions(
            Submit('create', 'Create!', css_class="btn-primary"),
        )
    )

我发现了许多与此类似的问题,但没有一个对我有帮助,而且我的要求也略有不同,因为用户没有编辑他/她的个人资料,但管理员正在编辑任何用户的个人资料。

仅供参考:

其中 11 是用户 ID

提前致谢,如果您需要更多信息,请告诉我。

【问题讨论】:

  • 没有人帮我:(
  • 在 Django-1.6 中,您可以使用 AUTH_USER_MODEL 扩展用户模型。
  • 感谢 Charlesliam,我能够扩展我的用户模型,但我的实际问题是如上所述从管理员(不是 Django 管理员)编辑用户配置文件。
  • 这是我需要的东西UserChangeForm。有人可以帮助我在我的观点中使用它吗?
  • 我不确定这是否是您要找的 - Generic views

标签: python-3.x django-1.6


【解决方案1】:

编辑:

这是我最终提出的解决方案(charlesliam 在他的评论中也提到了这一点)

我们将继承AbstractUser 以向用户添加额外的字段。显然,还有其他方法可以做到这一点,但使用 AbstractUser 应该足以满足您的要求。您必须同步数据库才能传播模型更改。

设置.PY

AUTH_USER_MODEL  = 'app.UserInformation' # Points to our custom User model which we will define in models.py

模型.PY

from django.contrib.auth.models import AbstractUser

class UserInformation(AbstractUser):
    # user = models.ForeignKey(User, unique=True) <---- Remove this field
    degree = models.ForeignKey(Degree, null=True, blank=True)
    stakeholder = models.ForeignKey(Stakeholder)
    cell_number = models.CharField(max_length=32, null=True, blank=True)

表格.PY

class EditUserForm(forms.ModelForm): #fixed typo. It's forms.ModelForm, not models.ModelForm
    class Meta:
        model = UserInformation

VIEWS.PY

from forms.py import EditUserForm

def edit_user (request, id):
    user = User.objects.get(id=11)
    if request.method == 'POST': #If form has been submitted
        form = EditUserForm(request.POST, instance=user)
        if form.is_valid(): #All good. Validation passed
            form.save()
            return HttpResponseRedirect('/your-view/') # Redirect after POST
    else:
            form = EditUserForm(instance=user) # Unbound form

    return render(request, 'MobiApp/edit_user.html', {'form': form})

编辑用户.html

{% load crispy_forms_tags %} 

{% crispy form %}

将为您提供一个包含用户实例的预填充表单,您可以对其进行编辑和 POST。

现在关于用户认证,您可以检查当前登录的用户是否是超级用户(管理员),然后继续进行表单编辑逻辑。

所以在你的 VIEWS.PY 中:

def edit_user (request, id):
    current_user = request.user
    if current_user.is_superuser:
        ...

或者,您可以将当前登录的用户分配到任何组,然后检查该用户是否是该组的成员,然后继续进行表单编辑。

希望对你有帮助。

参考:

【讨论】:

  • 感谢 Farhan 的详细回复。我面临 2 个问题,首先,我只看到 UserInformation 模型的字段(用户、利益相关者、学位和 cell_number),而不是 Django Auth 模型字段(如用户名、名字、姓氏、电子邮件和组)其次,甚至是来自 UserInformation 的字段未预先填充。
猜你喜欢
  • 2018-10-05
  • 2014-04-29
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多