首页 > 解决方案 > Django:在更新视图中更新字段的值

问题描述

我正在尝试显示模型的更新表单,其中我还想在同一视图中显示其父对象的字段(仅 1 个字段)。

我创建了一个包含所有模型字段和 1 个父字段的 forms.Form,并希望在更新视图中显示预先填写的相同表单。

模型.py

class Teammember(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    location = models.CharField(max_length=50)
    designation = models.CharField(max_length=50)
    date_of_joining = models.DateField()
    current_status = models.CharField(max_length=50)

    def __str__(self):
        return self.first_name + " " + self.last_name

    def get_absolute_url(self):
        return reverse('teammember-detail', kwargs={'pk': self.pk})

表格.py

class TeammemberUpdateForm(forms.Form):
    first_name = forms.CharField(max_length=50, label='First name')
    last_name = forms.CharField(max_length=50, label='Last name')
    email = forms.EmailField(label='Email')
    location = forms.ChoiceField(choices=TP_TM_Location, label='Location')
    designation = forms.ChoiceField(choices=TP_TM_Designation, label='Designation')
    date_of_joining = forms.DateField(label='Date of joining',
                                    widget=forms.TextInput(attrs={'type': 'date'}),
                                    initial=date.today())
    current_status = forms.ChoiceField(choices=TP_Status, label='Current status')
    username = forms.CharField(label='Login username')    #this field is referring to parent object

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['current_status'].initial = "Initial"

视图.py

class TeamUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    template_name = 'project_tracker/teammember/teammember_form.html'
    form_class = TeammemberUpdateForm
    model = Teammember
    #fields = ['first_name','last_name','email','location','designation','date_of_joining','current_status', 'username']

    def get(self, request, *args, **kwargs):
        #self.object = self.get_object()
        print("object id: " ,self.get_object().id)
        return super(TeamUpdateView, self).get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        formclass = self.get_form_class()
        print(self.get_form_class())
        #print(formclass.username)
        #formclass.username = 'ide'
        #context['username']=self.get_object().id
        #context['form']['username'] = 'ide'
        print(context['form']['username'])

        #context['form'] = self.form_class(instance=self.object)

        return context

    def get_form(self, *args, **kwargs):
        """
        Returns an instance of the form to be used in this view.
        # note: you can access request using: self.request
        """
        form = super().get_form()
        form.fields['username'] = 'ide'

        return form


    # def get_form_kwargs(self):
    #     kwargs = super(EmailView, self).get_form_kwargs()
    #     kwargs['users'] = self.users
    #     return kwargs

    def form_valid(self, form):
        return super().form_valid(form)

    def test_func(self):
        #teamMember = self.get_object()
        return True

由于每个团队成员都有一个用户名,我还想在团队成员更新视图中显示相关的用户名。但目前我无法显示更新表单中预先填充的用户名字段。

标签: djangodjango-class-based-views

解决方案


您可以get_form_kwargs在基于类的视图中使用。检查您是否pk or id 使用pk or id过,根据您的选择使用。

def get_form_kwargs(self):
        kwargs = super(TeamUpdateView, self).get_form_kwargs()
        x = Teammember.objects.values('user__username').select_related('user').filter(pk=self.kwargs['pk'])
        kwargs['user_name'] = x[0]['user__username']
        return kwargs

在你的 forms.py 中TeammemberUpdateForm。改变初始化

def __init__(self, *args, **kwargs):
        self.username = kwargs.pop('username')
        super(TeammemberUpdateForm,self).__init__(*args, **kwargs)
        self.fields['username'].initial = username

推荐阅读