как создать форму Django с множественным выбором поля и добавить эти значения в базу данных - PullRequest
1 голос
/ 11 октября 2019

чего я хочу добиться, так это того, что пользователь отправит 3 ввода в форме 1) имя 2) раскрывающийся список для выбора технического специалиста, 3) раскрывающийся список с множественным выбором для выбора нескольких продуктов. После того, как пользователь отправит детали, он сгенерирует один вывод в базе данных со значением, таким как имя, внешний ключ выбранного техника и идентификатор выбранных продуктов в другой таблице. Я не знаю, как добиться этого ниже, я упомянул свой подход к достижению того, чего я хочу. Пожалуйста, дайте мне знать, если модели нуждаются в каких-либо изменениях и как я могу написать представление для того же.

models.py

class product(models.Model):

    name = models.CharField(max_length=20)

class technician(models.Model):

    name = models.CharField(max_length=20)

class lead(models.Model):

    name = models.CharField(max_length=20)
    technician = models.ForeignKey(technician,on_delete=models.SET_NULL,null=True) #only single selection
    products = models.ManyToManyField(product) #user can select multiple product in dropdown

form.py

class leadForm(form.ModelForm):

    products = forms.MultipleChoiceField(queryset=Product.objects.all())
    technician = forms.CharField(max_length=30,choices=[(i.id,i.name) for i in Technician.objects.all().values('id','name') 
    class Meta:
        model = lead
        fields = ('name','technician')

1 Ответ

1 голос
/ 11 октября 2019

Вы должны использовать ModelMultipleChoiceField [Django-doc] здесь. Но на самом деле вам не нужно реализовывать модели самостоятельно. Вы можете просто позволить логике Django сделать всю работу за вас.

Чтобы дать текстовое представление в конце HTML, вы можете переопределить функции __str__ моделей:

class Product(models.Model):
    name = models.CharField(max_length=20)

    def <b>__str__</b>(self):
        return self.name

class Technician(models.Model):
    name = models.CharField(max_length=20)

    def <b>__str__</b>(self):
        return self.name

class Lead(models.Model):
    name = models.CharField(max_length=20)
    technician = models.ForeignKey(Technician, on_delete=models.SET_NULL, null=True)
    products = models.ManyToManyField(Product)

Тогда мы можем просто определить нашу форму с помощью:

class LeadForm(form.ModelForm):
    class Meta:
        model = Lead
        fields = '__all__'

Примечание : обычно классы записываются в PamelCase и, следовательно, начинаются с U ppercase.

Здесь вы можете использовать основанные на классе CreateView [Django-doc] например:

from django.views.generic.edit import <b>CreateView</b>
from app.models import Lead
from app.forms import LeafForm

class LeadCreateView(CreateView):
    model = Lead
    form_class = LeadForm
    template_name = 'create_lead.html'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...