Django: обновить значение для поля в представлении обновления - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь показать форму обновления для модели, в которой я также хочу показать поле родительского объекта (только 1 поле) в том же виде.

Я создал формы. Форма со всей модельюполя и 1 родительское поле и хотят показать ту же форму, предварительно заполненную в представлении обновления.

models.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})

forms.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"

views.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

Поскольку каждый teamMember имеет имя пользователя, я также хочу показать соответствующее имя пользователя в представлении обновлений членов команды. Но в настоящее время я не могу показать поле имени пользователя, предварительно заполненное в форме обновления.

1 Ответ

0 голосов
/ 11 ноября 2019

Вы можете использовать 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. изменить init

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