I am trying to edit layout of my form via forms.py. But if I try to set it up nothing happens and the form layout keeps the default layout.
Here is my models.py:
class AssetReceived(models.Model):
asset_user = models.ForeignKey(no_models.MyUser,on_delete=models.CASCADE, related_name='my_user_profile2')
asset_received = models.ForeignKey(Asset, on_delete=models.CASCADE)
asset_servicetag = models.CharField(blank=True, max_length=7)
asset_date = models.DateField(default=datetime.date.today)
asset_status = models.ForeignKey(AssetStatus, on_delete=models.CASCADE)
asset_note = models.CharField(blank=True, max_length=250)
asset_order_type = models.ForeignKey(AssetOrderType, on_delete=models.CASCADE)
asset_order_refresh = models.ForeignKey(AssetStoreMaster, on_delete=models.CASCADE, blank=True, null=True, related_name='sc_refresh')
asset_order_install = models.ForeignKey(AssetStoreMaster, on_delete=models.CASCADE, blank=True, null=True, related_name='sc_install')
asset_order_deinstall = models.ForeignKey(AssetStoreMaster, on_delete=models.CASCADE, blank=True, null=True, related_name='sc_deinstall')
here is my views.py:
class ReceivedAssetCreate(generic.CreateView):
template_name = 'received_asset/received-asset-new.html'
form_class = ReceivedAssetForm
def get_success_url(self):
return reverse('received_asset:received-asset-new')
def post(self, request):
form = self.form_class(request.POST)
if form.is_valid():
form.save(commit=True)
messages.success(request, f'Received asset has been received successfully')
return render(request, self.template_name, {"form": form})
here is my forms.py:
class ReceivedAssetForm(forms.ModelForm):
asset_user = forms.ModelChoiceField(queryset=no_models.MyUser.objects.all(), widget=autocomplete.ModelSelect2())
asset_servicetag = forms.CharField(required=False, widget=forms.TextInput(attrs={'placeholder': 'Service Tag'}))
asset_date = forms.DateInput
asset_note = forms.CharField(required=False)
asset_order_type = forms.ModelChoiceField(queryset=AssetOrderType.objects.all())
asset_order_refresh = forms.ModelChoiceField(queryset=AssetStoreMaster.objects.all(), required=False)
asset_order_install = forms.ModelChoiceField(queryset=AssetStoreMaster.objects.all(), required=False)
asset_order_deinstall = forms.ModelChoiceField(queryset=AssetStoreMaster.objects.all(), required=False)
asset_received = forms.ModelChoiceField(queryset=Asset.objects.all(), widget=autocomplete.ModelSelect2())
asset_status = forms.ModelChoiceField(queryset=AssetStatus.objects.all(),widget=autocomplete.ModelSelect2())
class Meta:
model = AssetReceived
fields = ['asset_user', 'asset_received', 'asset_servicetag', 'asset_date', 'asset_status', 'asset_note',
'asset_order_type', 'asset_order_refresh', 'asset_order_install', 'asset_order_deinstall']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(
'asset_user',
Row(
Column('asset_received', css_class='form-group col-md-6 mb-0'),
Column('asset_servicetag', css_class='form-group col-md-4 mb-0'),
Column('asset_date', css_class='form-group col-md-2 mb-0'),
css_class='form-row'
),
Row(
Column('asset_status', css_class='form-group col-md-6 mb-0'),
Column('asset_order_type', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
Row(
Column('asset_order_refresh', css_class='form-group col-md-6 mb-0'),
Column('asset_order_install', css_class='form-group col-md-6 mb-0'),
Column('asset_order_deinstall', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
'asset_note',
Submit('submit', 'Sign in')
)
template:
{% load crispy_forms_tags %}
{% block title %}New Asset Rceived{% endblock %}
{% block body %}
<div class="container">
<center><h1>New Asset Received</h1></center>
<form method="POST">
{% csrf_token %}
{{ form|crispy }}
{{ form.media }}
<input type="submit">
</form>
</body>
</html>
</div>
Do you have any idea why the layout wont change? I tried change the layout via template but same result. It still keeping the same default layout.
I believe that you've run into a somewhat-obscure/undocumented usage mistake. In your template, try changing {{ form|crispy }} to {% crispy form %}. I'm suggesting this based on three things:
Using
{% crispy %}tag because it rocks
As handy as the|crispyfilter is, think of it as the built-in methods:as_table,as_ulandas_p. You cannot tune up the output. The best way to make your forms crisp is using the{% crispy %}tag. It will change how you do forms in Django.
{{ form|crispy }} instead of using {% crispy form %}. The former will only emit Django's generic class based views."Again, I'm having a hard time finding any other documentation about this particular issue, but I'm fairly certain this is the answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With