장고 기본 양식 값 설정
다음과 같은 모델이 있습니다.
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
'source' 카테고리의 다른 글
MySQL VARCHAR 크기? (0) | 2022.09.20 |
---|---|
MySQL에서 이름 utf8을 설정하시겠습니까? (0) | 2022.09.20 |
MySQL의 varchar(최대)와 동등합니까? (0) | 2022.09.20 |
유효한 답변을 할 때까지 사용자에게 입력을 요구합니다. (0) | 2022.09.20 |
regex 문자열 이스케이프 (0) | 2022.09.20 |