Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Django - crispy forms layout

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.

like image 675
pipikej Avatar asked Jan 21 '26 02:01

pipikej


1 Answers

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:

  1. From their docs:

    Using {% crispy %} tag because it rocks
    As handy as the |crispy filter is, think of it as the built-in methods: as_table, as_ul and as_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.

  2. Stackoverflow post: "Make sure you are using the crispy form tag, not the crispy form filter...."
  3. Another Stackoverflow post: "What bit me was I left {{ 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.

like image 181
YellowShark Avatar answered Jan 22 '26 14:01

YellowShark



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!