django формы редактирования не сохраняют значения - PullRequest
1 голос
/ 17 апреля 2019

У меня есть простые формы Django для форм add и edit.моя проблема в области людей, где я использую ModelChoiceField.

в формах редактирования, все значения анализируются правильно, кроме этого поля ModelChoiceField.В формах редактирования это поле пустое и не содержит значений, есть идеи почему ??

def edit_work(request, pk):
    instance = get_object_or_404(work, id=pk)
    form = workForm(request.POST or None,instance=instance)
    if form.is_valid():
        note = form.save(commit=False)
        note.save()
        return HttpResponseRedirect('/work/success/')
    return render(request,'edit_work.html', {'form': form})


 def add_work(request):
     if request.method == "POST":
         form = workForm(request.POST)
         if form.is_valid():
             note = form.save(commit=False)
             note.save()
             return render(request, "succes/erga_success.html")
     else:
         form = workForm()
     return render(request, 'add_work.html',{'form':form})

forms.py

class workForm(forms.ModelForm):
    peaople=forms.ModelChoiceField(queryset=User.objects.all(),required=False, error_messages={
            'invalid': _("---")})
    class Meta:
        model = work
        fields = (__all__")

html page:

     <form  enctype="multipart/form-data" method="POST" action="">{% csrf_token %}
     {{form.peaople}}
     .........
     <input type="submit" value="create">
     </form>

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Почему вы вручную указываете поле peaople? Может быть, эти данные не сохраняются в поле WorkModel.peaople и сохраняются вручную в другом месте? Учитывая, что ModelChoiceField для одного значения, наиболее вероятно, что это поле ForeignKey и называются по-другому (не peaople): если настраиваемое поле ModelForm не соответствует полю с тем же именем в модели, то оно не заполняется по умолчанию.

Возможные решения:

  • Если имя поля модели отличается от поля в модели, вы должны передать initial={'peaople': instance.some_human_fk_field} аргумент при инициализации формы.
  • Если вам нужно только изменить виджет / метку / error_message и т. Д. Какого-либо существующего поля модели (например, some_human_fk_field) на ModelChoiceField, 'people', {'invalid': _("---")}, тогда вам не нужно определять настраиваемое поле в все:
class workForm(forms.ModelForm): 
    class Meta:
        model = work
        fields = ("__all__")
        labels = {
            'some_human_fk_field': _('People'),
        }
        error_messages = {
            'some_human_fk_field': {
                'invalid': _("---"),
            },
        }
        field_classes = {
            'some_human_fk_field': forms.ModelChoiceField,
        }

    def __init__(self, *args, **kwargs):
        super(workForm, self).__init__(*args, **kwargs)

        self.fields['some_human_fk_field'].queryset = User.objects.all()
        # Or you can dynamically determine queryset, for example you want to accout 'Work.owner.company' field: 
        # limiting_factor = None
        # if self.instance.pk:
        #     limiting_factor = self.instance.owner.company
        # elif self.data:
        #     _owner_pk = self.data.get('owner')
        #     limiting_factor = Company.objects.get(owners_set__pk=_owner_pk)
        # elif self.initial and self.initial.get('owner'):
        #     limiting_factor = self.initial['owner'].company

        # if limiting_factor:
        #     self.fields['some_human_fk_field'].queryset = build_qs_from_limiting_factor(
        #         User.objects.all(),
        #         company=limiting_factor
        #     )
        # else:
        #     self.fields['some_human_fk_field'].queryset = User.objects.all()

  • Если ваше поле peaople на модели work не является FK (например, TextField), то вам нужно «вручную установить» field.initial после инициализации формы:
class workForm(forms.ModelForm): 
    ...
    def __init__(self, *args, **kwargs):
        super(workForm, self).__init__(*args, **kwargs)
        if self.instance.pk and self.instance.peaople:
            self.fields['peaople'].initial = User.objects.filter(pk=self.instance.peaople)  # or `username=self.instance.peaople` depending on what you are really saving there

0 голосов
/ 17 апреля 2019

Значение не сохраняется, потому что вы его нигде не сохраняете, не присваиваете.

  1. Сохраните значение где-нибудь.
# views.py

# in both view functions
if form.is_valid():
    note = form.save(commit=False)
    note.save()
    somemodel.people = form.cleaned_data.get("people")
    somemodel.save()
  1. Инициализировать форму с сохраненным значением
def edit_work(request, pk):
    instance = get_object_or_404(work, id=pk)
    form = workForm(request.POST or None,instance=instance, initial={'people': somemodel.people})
    if form.is_valid():
        note = form.save(commit=False)
        note.save()
        somemodel.people = form.cleaned_data.get("people")
        somemodel.save()
        return HttpResponseRedirect('/work/success/')
    return render(request,'edit_work.html', {'form': form})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...