簡體   English   中英

如何使用Django UpdateView使用當前用戶數據填充表單

[英]How to populate a form with current user data with Django UpdateView

我有一個用戶定義,部分是這樣的:

class User(AbstractBaseUser):
    ...
    email = models.EmailField(unique=True)
    type = models.IntegerField(choices=STATUS_CHOICES)
    verified = models.BooleanField(default=False)
    created_date = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email'

...

用戶可以是自由職業者,也可以是客戶。 以Freelancer為例:

class Freelancer(models.Model):
    user = models.ForeignKey(User)
    first_name = models.CharField(max_length=128)
    ...

我已經創建了一個表格供用戶注冊。 當我注冊時,會得到他們選擇的用戶類型,並在適當的表中創建一條記錄:

if form.is_valid():
            user = form.save(commit=False)
            user.set_password(user.password)
            user.save()
            # create subgroup based on user type
            if user.type == 1:
                fl = Freelancer(user=user)
                fl.save()

現在,我有一個用戶和一個與該用戶鏈接的自由職業者,現在,我希望該用戶可以編輯其所有詳細信息:

class Profile(UpdateView):
    model = User
    form_class = UserUpdateForm
    second_form_class = FreelanceUpdateForm
    template_name = "freelancestudent/profile.html"

    def get_queryset(self):
        queryset = super(Profile, self).get_queryset()
        if not self.request.user.is_authenticated():
            return queryset.none()
        else:
            return queryset.filter(pk=self.request.user.pk)

    def get_context_data(self, **kwargs):
            context = super(Profile, self).get_context_data(**kwargs)
            context['form'] = self.form_class(self.request.GET, instance=self.request.user)
            context['form2'] = self.second_form_class(self.request.GET, instance=self.request.user)
            return context

    def get(self, request, *args, **kwargs):
        super(Profile, self).get(request, *args, **kwargs)
        form = self.form_class
        form2 = self.second_form_class
        return self.render_to_response(self.get_context_data(
            object=self.object, form=form, form2=form2))

表單如下所示:

class UserUpdateForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email',)


class FreelanceUpdateForm(forms.ModelForm):
    class Meta:
        model = Freelancer
        fields = ('university',)

問題在於它不會用現有數據填充數據。 我看了一下, 使我想到了instance=self.request.user想法,在調試時,我看到它確實得到了該用戶的實例,但沒有人口。 為什么是這樣?

您必須使用initial屬性來填充表單。

這是一個填充用戶電子郵件字段的示例。 不要忘記刪除self.request.GET ,在此視圖中它是無用的,並且不能用於:

context['form'] = self.form_class(instance=self.request.user, initial={'email':self.request.user.email})

閱讀Django文檔以獲取更多信息: dynamic-initial-values

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM