繁体   English   中英

在 Django 中编辑配置文件

[英]Editing profile in django

我想弄清楚如何从自定义 html 表单编辑和更新配置文件。 我看过有关如何使用UserChangeForm潜在地从 Django 的内置更改表单继承字段并使用它更改配置文件的教程。 但我宁愿使用我正在使用的模板附带的 html 页面。

这是个人资料页面的 html 文件:

...
<li><a href={% url editprofile %}>Edit Profile</a></li>
...

用于编辑个人资料页面的模板的 html

<form class="form-horizontal" action="app-instructor-profile.html" method="post" >
                      <div class="form-group">
                        <label for="photo" class="col-sm-2 control-label">Avatar</label>
                        <div class="col-md-6">
                          <div class="media v-middle">
                            <div class="media-left">
                              <div class="icon-block width-100 bg-grey-100">
                                <i class="fa fa-photo text-light"></i>
                              </div>
                            </div>
                            <div class="media-body">
                              <a href="#" class="btn btn-white btn-sm paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated> Add Image<i class="fa fa-upl"></i></a>
                            </div>
                          </div>
                        </div>
                      </div>
                      <div class="form-group">
                        <label for="inputEmail3" class="col-md-2 control-label">Full Name</label>
                        <div class="col-md-8">
                          <div class="row">
                            <div class="col-md-6">
                              <div class="form-control-material">
                                <input type="text" class="form-control" id="first_name" placeholder= {{ user.first_name }}>
                                <label for="first_name">First name</label>
                              </div>
                            </div>
                            <div class="col-md-6">
                              <div class="form-control-material">
                                <input type="text" class="form-control" id="last_name" placeholder={{ user.last_name }}>
                                <label for="last_name">Last name</label>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                      <div class="form-group">
                        <label for="email" class="col-md-2 control-label">Email</label>
                        <div class="col-md-6">
                          <div class="form-control-material">
                            <div class="input-group">
                              <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
                              <input type="email" class="form-control" id="email" placeholder={{ user.email }}>
                              <label for="inputEmail3">Email address</label>
                            </div>
                          </div>
                        </div>
                      </div>
                      <div class="form-group">
                        <label for="inputPassword3" class="col-md-2 control-label">Change Password</label>
                        <div class="col-md-6">
                          <div class="form-control-material">
                            <input type="password" class="form-control" id="password" placeholder="Password">
                            <label for="inputPassword3">Password</label>
                          </div>
                        </div>
                      </div>
                      <div class="form-group">
                        <div class="col-md-offset-2 col-md-6">
                          <div class="checkbox checkbox-success">
                            <input id="checkbox3" type="checkbox" checked="">
                            <label for="checkbox3">Subscribe to our Newsletter</label>
                          </div>
                        </div>
                      </div>
                      <div class="form-group margin-none">
                        <div class="col-md-offset-2 col-md-10">
                          <button type="submit" class="btn btn-primary paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated>Save Changes</button>
                        </div>
                      </div>
                    </form>

教师.py(视图)

@method_decorator([login_required, teacher_required], name='dispatch')
def edit_user(request,pk):
user = User.objects.get(pk=pk)
form = MentorProfileForm(instance=user)

if request.user.is_authenticated() and request.user.id == user.id:
    if request.method == 'POST':
        form = MentorProfileForm(request.POST, request.FILES, instance=profile)

        if form.is_valid():
            update = form.save(commit=False)
            update.user = user
            update.save()
        return HttpResponse('Confirm')
    else:
        form = MentorProfileForm(instance=profile)
    return render(request, 'teachers:app-student-profile', {'form':form})

表格.py

class TeacherSignUpForm(UserCreationForm):
    email = forms.EmailField(max_length=100)
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    linkedin = forms.URLField(max_length=200)

    class Meta(UserCreationForm.Meta):
        model = User
        fields = ('email', 'username', 'first_name', 'last_name')

    def save(self, commit=True):
        self.instance.is_teacher = True
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        mentor = Mentor.objects.create(
            user=user,
            linkedin=self.cleaned_data['linkedin']
        )
        return user
#edit mentor profile
class MentorProfileForm(ModelForm):
    class Meta:
        model = Mentor
        exclude = ['user']

和模型.py

class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)
    ...

class Mentor(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    linkedin = models.URLField(max_length=200,null=True,blank=True)
    photo = models.ImageField(null=True,blank=True)

    def __str__(self):
        return "Profile of user {}".format(self.user.username)

@receiver(post_save,sender=User)
def create_or_update(sender, instance,created, **kwargs):
    if created:
        Mentor.objects.create(user=instance)
    instance.profile.save()

我希望登录的用户单击编辑个人资料,重定向到 html 模板以编辑个人资料页面并根据所做的更改更新他们的信息。 但是,当我运行我的代码时,我收到此错误消息

“用户”对象没有“个人资料”属性

更新对 stackoverflow 进行了一些研究并对我的代码进行了一些更改

教师.py(视图)

#edit mentor profile
def edit_user(request,pk):
    user = request.user
    form = MentorProfileForm(initial={'first_name':user.first_name,'last_name':user.last_name,'email':user.email})
    if request.method == 'POST':
        if form.is_valid():
            user.first_name = request.POST['first_name']
            user.last_name = request.POST['last_name']
            user.email = request.POST['email']
            user.save()
            return HttpResponseRedirect('%s'%(reverse('profile')))
    context = {
        "form":form
    }
    return render(request, "teachers:app-instructor-profile",context)

网址.py

path('teachers/', include(([
    path('edit_user', teachers.edit_user, name='edit_user'),
], 'classroom'), namespace='teachers')),

但是,我仍然收到相同的错误消息

“用户”对象没有“个人资料”属性

您提到的错误很可能是由您的create_or_update信号引起的。 线

instance.profile.save()

正在尝试对您的User实例的某些profile属性调用save() 但是,您发布的User模型没有显示任何名为profile属性。 我不确定你想用那条线实现什么。 如果我正确理解您的代码,您将在创建新用户时尝试创建关联的Mentor 为此,您不需要该线并可以将其取出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM