i’m trying to set default value to an input field in django template , i have two models tables
class Ticketing(models.Model): Title = models.CharField(max_length=40) b = models.DecimalField(max_digits=5,decimal_places=2) #others class Cancel(models.Model): ticket = models.ForeignKey(Ticketing,on_delete=models.CASCADE,related_name="ticket") title = models.CharField(max_length=40) #others
forms.py
class CancelForm(forms.ModelForm): class Meta: model = Cancel fields = ['title',]
my views.py
def create_cancel(request,id): booking_obj = get_object_or_404(Ticketing,id=id) form = CancelForm() if request.method == 'POST': form = CancelForm(request.POST) if form.is_valid(): obj = form.save(commit=False) obj.admin = request.user obj.ticket= booking_obj obj.save() return redirect('cancel:create' ,booking_obj.id) context = { ' booking_obj':booking_obj,'form':form } return render(request,'cancel/create.html',context)
urls
path('create/<int:id>',create_cancel,name='create'), path('ajax/check-title/<int:id>',create_cancel,name='check_title'),
i tried to call back title
using ajax but it doesnt work
@login_required def check_invoice_paid(request,id): obj = get_object_or_404(Ticketing,id=id) data = { 'title':obj.title } return JsonResponse(data)
my template
$('select').change(function() { let elm = $(this); data = {}; data[elm.attr("name")] = elm.val(); $.ajax({ url:'{% url 'cancel:check_title' booking_obj.id %}', data:data, success:function(data){ if (data.title){ elm.closest("div.ticket ").find("input.title").val(data.title); } } } ) })
<form action="" method="POST">{% csrf_token %} {{form.errors}} <div id="printDv" class="text-lg"> <p class="p-2 header rounded-lg text-center text-white">Cancel</p> <div class="border border-purple-900 mt-2 rounded-lg p-2 text-center"> <p>no. : {{booking_obj.id}} </p> </div> <div class="ticket border border-purple-900 mt-2 text-center rounded-lg p-2 grid grid-cols-1 md:grid-cols-1 gap-3" dir="ltr" > <p>{{form.title | add_class:'title bg-transparent focus:outline-none w-8/12' }} :title</p> </div> </div> <button class="header pt-2 text-white px-4 p-1 rounded-lg mt-4">save</button> </form>
im trying to set booking_obj.title
as default value for title
input in the Cancel
model
thank you for helping
Advertisement
Answer
Pass an initial object to the form on initialization to set initial values. Be careful with the names of the fields you have declared in the form and model.
def create_cancel(request,id): booking_obj = get_object_or_404(Ticketing,id=id) # set initial data here initial_data = {'title': 'Title' } form = CancelForm(initial=data) if request.method == 'POST': form = CancelForm(request.POST) if form.is_valid(): obj = form.save(commit=False) obj.admin = request.user obj.ticket= booking_obj obj.save() return redirect('cancel:create' ,booking_obj.id) context = { ' booking_obj':booking_obj,'form':form } return render(request,'cancel/create.html',context)