Мои формы.ModelMultipleChoiceField выглядят так:
Показывает, как выглядят мои формы.ModelMultipleChoiceField
Когда это должно выглядеть так:
Показывает, как формируются. ModelMultipleChoiceField должен выглядеть так:
forms.py:
Код: Выделить всё
from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
from django.contrib.admin.widgets import FilteredSelectMultiple
from home.models import Collection, Tag, Product
class ProductAssignForm(forms.Form):
from_name = forms.CharField(required=True, max_length=255, label='From Name')
to_name = forms.CharField(required=True, max_length=255, label='To Name')
assign_collections_name = forms.ModelMultipleChoiceField(
queryset=Collection.objects.all(),
required=False,
widget=FilteredSelectMultiple(
verbose_name='Collections',
is_stacked=False
),
label='Assign Collection Name'
)
tags = forms.ModelMultipleChoiceField(
queryset=Tag.objects.all(),
required=False,
widget=FilteredSelectMultiple(
verbose_name='Tags',
is_stacked=False
),
label='Tags'
)
class Meta:
model = Product
fields = ['collections', 'tags'] # Include the tags field in the fields list
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_method = 'POST'
self.helper.add_input(Submit('submit', 'Assign Products'))
Код: Выделить всё
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
form = ProductAdminForm
list_display = ('name', 'quantity', 'price', 'first_collection')
exclude = ('user', 'updated',)
def save_model(self, request, obj, form, change):
if not obj.user:
obj.user = request.user
obj.save()
def first_collection(self, obj):
first_collection = obj.collections.first()
return first_collection.name if first_collection else 'No collection'
def get_urls(self):
# return [
# path('assign-products/', self.admin_site.admin_view(self.assign_products), name='assign-products'),
# ] + super().get_urls()
custom_urls = [
path('assign-products/', self.admin_site.admin_view(self.assign_products), name='assign-products'),
*super().get_urls(),
]
return custom_urls
def assign_products(self, request):
opts = self.model._meta
if request.method == 'POST':
form = ProductAssignForm(request.POST)
if form.is_valid():
from_name = form.cleaned_data['from_name']
to_name = form.cleaned_data['to_name']
assign_collections_name = form.cleaned_data['assign_collections_name']
tags = form.cleaned_data['tags']
print(f"Searching products from '{from_name}' to '{to_name}'")
# Normalizing the names by removing whitespace and non-alphanumeric characters
from_name_normalized = ''.join(e for e in from_name if e.isalnum()).lower()
to_name_normalized = ''.join(e for e in to_name if e.isalnum()).lower()
# Search by search_name
products = Product.objects.filter(
search_name__gte=from_name_normalized,
search_name__lte=to_name_normalized
)
print(f"search_handle__gte={from_name_normalized}, search_handle__lte={to_name_normalized}")
print(f"Found {products.count()} products")
for product in products:
if assign_collections_name:
print(f"Assigning collections to product '{product.name}'")
product.collections.set(assign_collections_name)
if tags:
print(f"Assigning tags to product '{product.name}'")
product.tags.set(tags)
product.save()
return HttpResponseRedirect(request.path_info)
else:
form = ProductAssignForm()
context = dict(
self.admin_site.each_context(request),
title="Assign Products",
form=form,
opts=opts,
**self.admin_site.each_context(request),
)
return render(request, 'admin/assign_products.html', context)
Код: Выделить всё
{% block extrahead %}
{{ block.super }}
{{ form.media }}
{% endblock %}
{% block javascript %}
{{ block.super }}
django.jQuery(document).ready(function() {
django.jQuery('.selectfilter').filterchain();
});
{% endblock %}
{% block breadcrumbs %}
[url={% url ]{% translate 'Home' %}[/url]
› [url={% url opts|admin_urlname:]{{ opts.verbose_name_plural|capfirst }}[/url]
› [url={% url ]{% translate 'Assign Products' %}[/url]
{% endblock %}
{% block content %}
{% translate 'Assign Products' %}
{% csrf_token %}
{% for field in form %}
{{ field.label }}
{{ field }}
{% if field.help_text %}
{{ field.help_text }}
{% endif %}
{% for error in field.errors %}
{{ error }}
{% endfor %}
{% endfor %}
{% translate 'Assign Products' %}
{% endblock %}
Будем очень благодарны за помощь!
Подробнее здесь: https://stackoverflow.com/questions/787 ... working-on