source

장고 기본 양식 값 설정

factcode 2022. 9. 20. 23:53
반응형

장고 기본 양식 값 설정

다음과 같은 모델이 있습니다.

class TankJournal(models.Model):
    user = models.ForeignKey(User)
    tank = models.ForeignKey(TankProfile)
    ts = models.IntegerField(max_length=15)
    title = models.CharField(max_length=50)
    body = models.TextField()

위 모델의 모델폼도 아래와 같이 가지고 있습니다.

class JournalForm(ModelForm):
    tank = forms.IntegerField(widget=forms.HiddenInput()) 

    class Meta:
        model = TankJournal
        exclude = ('user','ts')

탱크 숨김 필드의 기본값을 설정하는 방법을 알고 싶습니다.지금까지의 폼을 표시/저장하는 기능은 다음과 같습니다.

def addJournal(request, id=0):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/')

    # checking if they own the tank
    from django.contrib.auth.models import User
    user = User.objects.get(pk=request.session['id'])

    if request.method == 'POST':
        form = JournalForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)

            # setting the user and ts
            from time import time
            obj.ts = int(time())
            obj.user = user

            obj.tank = TankProfile.objects.get(pk=form.cleaned_data['tank_id'])

            # saving the test
            obj.save()

    else:
        form = JournalForm()

    try:
        tank = TankProfile.objects.get(user=user, id=id)
    except TankProfile.DoesNotExist:
        return HttpResponseRedirect('/error/')

를 사용할 수 있습니다.이것에 대해서는, 을 참조해 주세요.

폼 컨스트럭터를 호출할 때 값을 채울 수 있는 두 가지 옵션이 있습니다.

form = JournalForm(initial={'tank': 123})

또는 폼 정의에서 값을 설정합니다.

tank = forms.IntegerField(widget=forms.HiddenInput(), initial=123) 

기타 솔루션:폼 작성 후 initial 설정

form.fields['tank'].initial = 123

POST 값에서 모델 양식을 작성하는 경우 initial을 다음과 같이 할당할 수 있습니다.

form = SomeModelForm(request.POST, initial={"option": "10"})

https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/ #syslog-initial-values

저는 다른 솔루션을 가지고 있었습니다(다른 사람이 모델에서 다음 방법을 사용하고 있을 경우에 대비하여 투고합니다).

class onlyUserIsActiveField(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(onlyUserIsActiveField, self).__init__(*args, **kwargs)
        self.fields['is_active'].initial = False

    class Meta:
        model = User
        fields = ['is_active']
        labels = {'is_active': 'Is Active'}
        widgets = {
            'is_active': forms.CheckboxInput( attrs={
                            'class':          'form-control bootstrap-switch',
                            'data-size':      'mini',
                            'data-on-color':  'success',
                            'data-on-text':   'Active',
                            'data-off-color': 'danger',
                            'data-off-text':  'Inactive',
                            'name':           'is_active',

            })
        }

이니셜은 에서 소거됩니다.__init__로서 기능하다.self.fields['is_active'].initial = False

장고 문서에서도 설명했듯이initial아니다default.

  • 필드의 초기값은 HTML로 표시되도록 되어 있습니다.단, 사용자가 이 값을 삭제하고 마지막으로 이 필드의 빈 값을 반환하면,initial값이 손실됩니다.따라서 기본 동작에서 예상되는 것을 얻지 못합니다.

  • 기본 동작은 다음과 같습니다.검증 프로세스가 사용하는 값은 다음과 같습니다.data인수에는 필드 값이 포함되어 있지 않습니다.

이를 구현하기 위해 간단한 방법은 다음과 같이 결합하는 것입니다.initial그리고.clean_<field>():

class JournalForm(ModelForm):
    tank = forms.IntegerField(widget=forms.HiddenInput(), initial=123) 

    (...)

    def clean_tank(self):
        if not self['tank'].html_name in self.data:
            return self.fields['tank'].initial
        return self.cleaned_data['tank']

도움이 되었으면 합니다.

form.instance.updatedby = form.cleaned_data['updatedby'] = request.user.id

개발 중에 폼에서 기본값을 설정해야 하는 경우도 있었습니다.저의 해결책은

initial={"":""}
form=ArticleModel(request.POST)
if form.has_changed():
    data = {i: form.cleaned_data[i] for i in form.changed_data}
    data.update({key: val for key, val in init_praram.items() if key not in form.changed_data})

form.has_fields 를 사용합니다.form.fields 가 필요한 경우 이 방법을 사용할 수 있습니다.

폼에 이니셜을 추가하는 방법: @Sergey Golovchenco의 답변을 읽었습니다.

그래서 그냥 의 양식에 추가했습니다.if request.method == 'POST':하지만 폼을 게시하기 전에 어떤 가치를 얻었는지 알고 싶다면, 이 위치에 배치하지 마십시오.당신은 그것을 다른 것이 있는 곳에 넣어야 합니다.

뷰에서 예를 들어보겠습니다.화이

def myForm(request):
    kontext = {}

    if request.method == 'POST':
        # You might want to use clean_data instead of initial here. I found something on a stack overflow question, and you add clean data to the Forms.py, if you want to change the post data. https://stackoverflow.com/questions/36711229/django-forms-clean-data
        form = myModelForm(request.POST, initial={'user': request.user})
        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        # you need to put initial here, if you want to see the value before you post it
        form = myModelForm(initial={'user': request.user})
    kontext['form'] = form
    return render(request, 'app1/my_form.html', kontext)

언급URL : https://stackoverflow.com/questions/604266/django-set-default-form-values

반응형