Instead of using the default as_p method to render form fields, you can add them separately in the template. This will enable you to format and position each field according to your specific requirements.
This is the same form we've already used in our project
from django import forms
from django.contrib.auth.forms import UserChangeForm
from django.contrib.auth.models import User
from tinymce.widgets import TinyMCE
from captcha.fields import CaptchaField
from .models import DBSpecies, DBFossil, Profile, DBFossilGathering, DBEvent, FossilEvent
class FormSpecies(forms.ModelForm):
captcha = CaptchaField()
class Meta:
model = DBSpecies
fields = "__all__"
exclude = ("species_owner", )
widgets = {
'species_name':forms.TextInput(attrs={'class':'form-control', 'placeholder':'Species name (required)'}),
'species_image':forms.FileInput(attrs={'class':'form-control'}),
'species_description':forms.Textarea(attrs={'class':'form-control'}),
'species_is_archived':forms.CheckboxInput(attrs={'class': 'form-check-input'}),
}
def __init__(self, user, *args, **kwargs):
super(FormSpecies, self).__init__(*args, **kwargs)