Как установить Current_company_flag, используя Django - PullRequest
1 голос
/ 17 марта 2020

Я создаю модель для хранения опыта ...

Вот моя модель

class Experience(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=255, blank=True)
    company = models.CharField(max_length=255, blank=True)
    current_company = models.BooleanField(default=False)
    start_date = models.DateField(default=datetime.now)
    end_date = models.DateField(default=datetime.now)

В этой current_company используется для показа, что это текущая компания ....

Это моя форма для получения данных от пользователя

class  ExperienceForm(forms.ModelForm):

    class Meta:
        model = Experience
        exclude = ['user']

Это мое мнение

class ExperienceFormView(TemplateView, LoginRequiredMixin):
    template_name = 'accounts/profile/expereince_form.html'
    form_class = ExperienceForm

    def post(self, request, *args, **kwargs):
        context = self.get_context_data()
        if context['form'].is_valid():
            data = context['form'].save(commit=False)
            data.user = request.user
            data.save()
            return JsonResponse({'status': 'success', 'message': 'Created Successfully'}, status=201, safe=False)
        return super(ExperienceFormView, self).render_to_response(context)

    def get_context_data(self, **kwargs):
        context = super(ExperienceFormView, self).get_context_data(**kwargs)
        form = ExperienceForm(
            self.request.POST or None)  # instance= None
        context["form"] = form
        return context

Как лучше всего реализовать следующие варианты использования

1) Если я активирую свою current_company как True, тогда предыдущий объект, имеющий current_company, становится False

2) Если предыдущего объекта нет, тогда игнорируем первый вариант использования .....

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Вы можете обновить Experience объекты, относящиеся к пользователю, так что current_company будет False с помощью запроса:

class ExperienceFormView(TemplateView, LoginRequiredMixin):
    template_name = 'accounts/profile/expereince_form.html'
    form_class = ExperienceForm

    def post(self, request, *args, **kwargs):
        context = self.get_context_data()
        if context['form'].is_valid():
            data = context['form'].save(commit=False)
            data.user = request.user
            if data.current_company:
                <b>Experience.objects.filter(user=request.user).update(current_company=False)</b>
            data.save()
            return JsonResponse({'status': 'success', 'message': 'Created Successfully'}, status=201, safe=False)
        return super(ExperienceFormView, self).render_to_response(context)

    def get_context_data(self, **kwargs):
        context = super(ExperienceFormView, self).get_context_data(**kwargs)
        form = ExperienceForm(
            self.request.POST or None)  # instance= None
        context["form"] = form
        return context
0 голосов
/ 17 марта 2020

Вы можете добавить класс ExperienceManager в Experience. Менеджеры позволяют вам выполнять операции с моделями django на уровне набора запросов, что представляется целесообразным, поскольку вам необходим доступ к одноуровневым элементам Experience, чтобы превратить предыдущее значение в false. Например, когда вы используете Experince.objects.all (), «objects» является классом менеджера по умолчанию. Вот как вы можете определить свои собственные.

class ExperienceManager( models.Manager ):

    #self is of type objects in Experience.objects.
    def getOrderedExpereince( self ): 
        experiences = self.all()
        experiences = orderExp( experiences ) # whatever your criteria for sorting
        return experiences
    def updateActiveExperience( self, experience ):
        experiences = self.getOrderedExperiences()
        currentIndex = [ i for i, exp in enumerate(experiences) if exp == experience]
        if currentIndex: currentIndex = currentIndex[0]
        experiences[i] = True
        experiences[i].save()
        experiences[i-1] = False
        experiences[i-1].save()
        return experiences # or whatever
class Experience( models.Model ):
    mymanager = ExperienceManager()
    ....

Тогда в ваших формах вы можете сказать

    def post(self, request, *args, **kwargs):
        context = self.get_context_data()
        if context['form'].is_valid():
            data = context['form'].save(commit=False)

            #Added this line
            data.mymanager.updateActiveCompany(data)
            data.user = request.user
            data.save()

Примечание. Я не проверял, запустите выше, но это что-то близко к этому .

0 голосов
/ 17 марта 2020

В ExperienceFormView.post() вы захотите выполнить поиск опыта этого пользователя ... в части form.is_valid(). Что-то вроде

current_experience = Experience.objects.filter(user=request.user, current_company=True)
if current_experience:
    current_experience.current_company = False
    current_company.save()
...