Django formlarında modeller oluşturmak ve güncellemek için yeniden kullanılabilir form şablonları oluşturmaya çalışmak için epeyce gün harcadım. Nesneyi değiştirmek veya oluşturmak için ModelForm kullandığımı unutmayın. Formlarımı biçimlendirmek için de önyükleme kullanıyorum. Geçmişte bazı formlar için django_form_tweaks kullandım, ancak çok fazla şablon bağımlılığı olmadan bazı özelleştirmelere ihtiyacım vardı. Projemde zaten jQuery bulunduğundan, formlarımı biçimlendirmek için özelliklerinden yararlanmaya karar verdim. İşte kod ve herhangi bir biçimde çalışabilir.
#forms.py
from django import forms
from user.models import User, UserProfile
from .models import Task, Transaction
class AddTransactionForm(forms.ModelForm):
class Meta:
model = Transaction
exclude = ['ref_number',]
required_css_class = 'required'
Views.py
@method_decorator(login_required, name='dispatch')
class TransactionView(View):
def get(self, *args, **kwargs):
transactions = Transaction.objects.all()
form = AddTransactionForm
template = 'pages/transaction.html'
context = {
'active': 'transaction',
'transactions': transactions,
'form': form
}
return render(self.request, template, context)
def post(self, *args, **kwargs):
form = AddTransactionForm(self.request.POST or None)
if form.is_valid():
form.save()
messages.success(self.request, 'New Transaction recorded succesfully')
return redirect('dashboard:transaction')
messages.error(self.request, 'Fill the form')
return redirect('dashboard:transaction')
HTML Kodu
Not: Birçok görünüm oluşturma zorluğunu ortadan kaldırmak için bootstrap4 modunu kullanıyorum. Belki genel CreateView veya UpdateView kullanmak daha iyidir. Bootstrap ve jqQery'yi bağlama
<div class="modal-body">
<form method="post" class="md-form" action="." enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="row">
<div class="col-md-12">
<div class="form-group row">
<label for="" class="col-sm-4 col-form-label {% if field.field.required %}
required font-weight-bolder text-danger{%endif %}">{{field.label}}</label>
<div class="col-sm-8">
{{field}}
</div>
</div>
</div>
</div>
{% endfor %}
<input type="submit" value="Add Transaction" class="btn btn-primary">
</form>
</div>
Javascript Kodu bunu $(document).ready(function() { /* ... */});
fonksiyona yüklemeyi unutmayın .
var $list = $("#django_form :input[type='text']");
$list.each(function () {
$(this).addClass('form-control')
});
var $select = $("#django_form select");
$select.each(function () {
$(this).addClass('custom-select w-90')
});
var $list = $("#django_form :input[type='number']");
$list.each(function () {
$(this).addClass('form-control')
});
var $list = $("form :input[type='text']");
$list.each(function () {
$(this).addClass('form-control')
});
var $select = $("form select");
$select.each(function () {
$(this).addClass('custom-select w-90')
});
var $list = $("form :input[type='number']");
$list.each(function () {
$(this).addClass('form-control')
});