У меня есть простая модель и даже более простая форма модели, но я просто не могу понять, как установить начальное или пользовательское значение для моего поля формы.
Я пытался с form.cleaned_data['fieldname'] = value, initial={'field':value}, form.fields['field'].initial = value
, даже индексировал его вот так form.cleaned_data['status'] = Locked.STATUS[0][0]
, но не смог заставить его работать.
Для записи я хочу использовать поле выбора из моей модели. Имя поля «STATUS», и я хочу установить первое значение («odlozen»), которое будет использоваться в качестве значения поля формы, в моем views.py. Таким образом, form.cleaned_data должен быть значением STATUS 'odlozen', когда эта функция срабатывает.
PS. Не обращайте внимания на то, что я не объявил весь мой код, поскольку в этом вопросе нет необходимости. Спасибо!
Давайте начнем с моего кода:
models.py
class Locked(models.Model):
STATUS = (
('odlozen', 'Odložen'), #this is the value
('u_procesu', 'U procesu'),
('ne_javlja_se', 'Ne javlja se'),
('zakazan', 'Zakazan'),
('odustao', 'Odustao'),
('default', 'Izaberite status.'),
)
...
opp_comment = models.CharField(max_length=155, blank=True)
status = models.CharField(max_length=50, choices=STATUS, blank=True) #I set blank=True for no reason, it can be False also.
...
class Meta:
verbose_name = 'Locked'
verbose_name_plural = 'Locked'
get_latest_by = 'locked_name'
def __str__(self):
return smart_str(self.locked_eluid)
Это мои формы.py:
class OppDetaljiForm(forms.ModelForm):
class Meta:
model = Locked
fields = [... ,'status','opp_comment', ...]
labels = {
...
'opp_comment': 'Comment',
'status': 'Status',
...
}
widgets = {
...
'status': forms.HiddenInput(),
'opp_comment': forms.Textarea()
}
Мой view.py:
def odlozi(request, pk):
opp_locked = Locked.objects.get(pk=pk)
form = OppDetaljiForm(instance=opp_locked)
...
if request.method == 'POST':
form = OppDetaljiForm(request.POST or None, instance=opp_locked, initial={'status': 'odlozen'})
if form.is_valid():
form.cleaned_data['status'] = 'odlozen' #?! As I said before, none of my ideas worked.
...
form.save()
...
return redirect('appname:url') # Dont mind me for not declaring my code, since it not necessary
context = {
'form': form,
...
}
return render(request, 'myhtmlpage.html', context)
А это HTML:
<div class="container" style="position: relative">
<form action="" method="POST">
{% csrf_token %}
<div class="form-row my-4">
<div class="form-group col-md-6 mb-0">
{{ form.status|as_crispy_field }}
</div>
<div class="form-group col-md-12 mb-0">
{{ form.opp_comment|as_crispy_field }}
</div>
...
# Other form fields
...
</div>
<a class="btn btn-light" href="{% url 'appname:url' %}">Back</a>
<button type="submit" class="btn btn-primary" style="float: right">Submit</button>
</form>
</div>