Застрял на связывание отношений ManytoMany с Modelform - PullRequest
1 голос
/ 19 октября 2019

Я довольно новичок в Django, и я работаю над проектом, который в настоящее время требует следующего:

У меня есть две основные структуры: модель проекта и модель TeamMember - обе связаны друг с другом черезМногие многие отношения. Тогда у меня есть TMA назначенный сквозной класс. Со временем у члена команды будет много проектов, назначенных ему.

У меня есть ModelFrom, который создает модель проекта посредством создания формы.

Мой вопрос: Как мне связать члена команды с вновь созданным проектом после отправки формы?

Вот немного моей модели и формыкод:

TeamMember

class TeamMember(models.Model):
    firstname = models.CharField(max_length=100, default= "First Name")
    lastname = models.CharField(max_length=100, default= "Last Name")
    fullname = models.CharField(max_length=100, default= "Full Name")
    email = models.EmailField(max_length=254)
    cellphone = PhoneNumberField(null=False, blank=False, unique=True)
    numberofcases = models.IntegerField(max_length=10000, default=0)

    @property
    def fullnamefunc(self):
        fullname = "{} {}".format(self.firstname, self.lastname)
        return fullname

    def __str__(self):
        return self.fullname

Проект

class Project(models.Model):
    pursuitname = models.CharField(max_length=500)
    datecreated = models.DateTimeField(auto_now=True)
    bdmember = models.ManyToManyField('team.TeamMember')

Views.py

class bdFormView(TemplateView):
    template_name = os.path.join(BASE_DIR, "templates/masterform/bdform.html")

    def get(self,request):
        form = bdForm()
        return render (request, self.template_name, {'form': form})

    def post(self, request):
        form = bdForm(request.POST)

        if form.is_valid():
            print("form is valid")

            project = form.save(commit=False)
            project.save()
            text = form.cleaned_data['briefcard']

Form.py

class bdForm(forms.ModelForm):

            bdmemberlist = TeamMember.objects.all().order_by('lastname')
            pursuitname = forms.CharField()
            bdmember = forms.ModelChoiceField(queryset= bdmemberlist)
            addbdteam = forms.ModelMultipleChoiceField(
            queryset=TeamMember.objects.all().order_by('lastname'), widget=Select2MultipleWidget,  required=False)



            class Meta:
                model = Project
                fields = ['pursuitname','addbdteam','bdmember',]



        def __init__(self, *args, **kwargs):

            if kwargs.get('instance'):
                initial = kwargs.setdefault('initial', {})
                initial['projects'] = [t.pk for t in
                    kwargs['instance'].project_set.all()]

            forms.ModelForm.__init__(self, *args, **kwargs)

        def save(self, commit=True):
            instance = forms.ModelForm.save(self, False)
            old_save_m2m = self.save_m2m

            def save_m2m():
                old_save_m2m()

                for project in self.cleaned_data['bdmember']:
                    instance.teammember_set.add(project)

Заранее спасибо !!

Правка - после нескольких исследований яЯ удалил модель «Сквозная» из сценария и пытаюсь использовать метод сохранения form.py для объединения. Тем не менее, когда я делаю это, они все еще не соединяются должным образом.

1 Ответ

0 голосов
/ 20 октября 2019

Поскольку в систему будут входить только ваши администраторы (суперпользователи?), Вы можете начать с помощью встроенного администратора Django.

Я бы порекомендовал это вам, по крайней мере, на данный момент, потому что вы новичок, а форма администратора очень проста в использовании. Затем вы можете создать пользовательскую форму позже, когда вам будет удобнее. : -)

Имея это в виду, вы можете попробовать исключить сквозную таблицу (может потребоваться сбросить миграцию) и попробовать это.

Admin.py

from django.contrib import admin
from .models import TeamMember, TMAssigned, Project, 

TeamMembersInLine(admin.TabularInline):
    model = TeamMember
    extra = 1

@admin.register(Project):
class ProjectAdmin(admin.ModelAdmin):
    list_display = ('pursuitname', 'bdmember ', 'datecreated')
    inlines = [TeamMembersInLine]

Вот еще один ответ , который углубляется в сквозную таблицу. Кто-то спросил в вашей ситуации, и ответ тоже актуален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...