python - example - django urls



يتم حفظ نموذج جانغو مرتين بعد إنشاء (1)

إضافة dispatch_uuid أثناء توصيل جهاز الاستقبال وفقا للمستندات

def create_delivery(sender, instance, created, **kwargs):
    if created:
        delivery,created_delivery = Delivery.objects.get_or_create(job=instance)
        instance.delivery = delivery
        delivery.save()
    instance.save()

post_save.connect(create_delivery, sender=Job, dispatch_uid="my_unique_identifier")

لا أستطيع معرفة كيف يتم حفظ نموذجي مرتين. ويسمى هذا النموذج Job . إذا قام العميل بإنشاء أمر، يتم إنشاء مثيل Job . بعد إنشاء، هناك إشارة، الذي ينبه المشرف أن كائن Job جديدة تم إنشاؤها أو تحريرها.

@receiver(post_save,sender=Job)
def alert_admin(sender,instance,created,**kwargs):
    if created:
        email.AdminNotifications.new_order(instance)
    else:
        email.AdminNotifications.edited_order(instance)

إديت: لقد اكتشفت ما يسبب المشكلة، انها إشارة (الجزء السفلي جدا من السؤال). ولكن، أنا بحاجة إلى هذه الإشارة حتى لا أزال غير قادر على معرفة كيفية القيام بهذا العمل ...

المشكلة هي أن Admin يستلم رسالتين إلكترونيتين بعد أن يقوم User بإنشاء Job . رسالة بريد إلكتروني واحدة هي أنه تم إنشاء الطلب وتفيد رسالة البريد الإلكتروني الثانية بأنه قد تم تعديل الطلب.

أظن أن سبب ذلك لأنني قد إعادة كتابة طريقة save وبدء، لخلق شيء مثل signal ، عندما يتم تغيير سمة Job - approved . أجد أن النصيحة هنا سو سؤال لأنه لأنه بعد إنشاء Job ، المشرف لديه للموافقة عليه - مجرد تغيير قيمة Bool من سمة approved من كائن Job .

أنا ربط view ، حيث يتم إنشاء Job ونموذج Job .

رأي:

def create_order(request):
    LanguageLevelFormSet = formset_factory(LanguageLevelForm, extra=5, max_num=5)
    language_level_formset = LanguageLevelFormSet(request.POST or None)
    job_creation_form = JobCreationForm(request.POST or None, request.FILES or None)

    context = {'job_creation_form': job_creation_form,
               'formset': language_level_formset}

    if request.method == 'POST':
        if job_creation_form.is_valid() and language_level_formset.is_valid():
            cleaned_data_job_creation_form = job_creation_form.cleaned_data
            cleaned_data_language_level_formset = language_level_formset.cleaned_data
            for language_level_form in [d for d in cleaned_data_language_level_formset if d]:
                language = language_level_form['language']
                level = language_level_form['level']
                Job.objects.create(
                        customer=request.user,
                        text_to_translate=cleaned_data_job_creation_form['text_to_translate'],
                        file=cleaned_data_job_creation_form['file'],
                        short_description=cleaned_data_job_creation_form['short_description'],
                        notes=cleaned_data_job_creation_form['notes'],
                        language_from=cleaned_data_job_creation_form['language_from'],
                        language_to=language,
                        level=level,
                )

            return HttpResponseRedirect('/order-success')
        else:
            return render(request, 'auth/jobs/create-job.html', context=context)

    return render(request, 'auth/jobs/create-job.html', context=context)

وظيفة:

class Job(models.Model):
    customer = models.ForeignKey(User, related_name='orders', help_text=_("Customer"), on_delete=models.CASCADE)
    translator = models.ForeignKey(User, related_name='jobs', null=True, blank=True, help_text=_(u"Translator"))
    price = models.FloatField(null=True, blank=True, help_text=_(u"Price"))
    language_from = models.ForeignKey(Language, related_name='jobs_from', null=True)
    language_to = models.ForeignKey(Language, related_name='jobs_to', null=True)
    short_description = models.CharField(max_length=40, blank=False,
                                         help_text=_(u"Very short description of this order"))
    notes = models.TextField(help_text=_("Notes"))
    text_to_translate = models.TextField(verbose_name='Text to translate', blank=True, null=True,
                                         help_text=u"Text, ktorý chcete preložiť (ak neprikladáte súbor).")
    file = models.FileField(null=True, blank=True, help_text=u"Upload file")
    level = models.ForeignKey(Level, null=False, default=None)
    delivery_date = models.DateField(null=True, blank=True, help_text=_('Deadline'))

    PROGRESS_CHOICES = (

        ('translator_not_assigned_yet', 'Translator not assigned yet'),
        ('in_translation_process', 'In translation process'),
        ('translated', 'Translated'),
        ('complete', 'Complete')
    )
    progress = models.CharField(choices=PROGRESS_CHOICES, max_length=40, default='translator_not_assigned_yet')
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=False)
    is_done = models.BooleanField(default=False)

    approved = models.BooleanField(default=False)
    __original_approved = None

    def __init__(self, *args, **kwargs):
        super(Job, self).__init__(*args, **kwargs)
        self.__original_approved = self.approved

    def save(self, force_insert=False, force_update=False, *args, **kwargs):
        if self.approved != self.__original_approved and self.approved == True:
            send_job_alert(self)
        else:
            pass
        super(Job, self).save(force_insert, force_update, *args, **kwargs)
        self.__original_approved = self.approved

    @staticmethod
    def get_approved_pending_jobs():
        approved_pending_jobs = Job.objects.filter(approved=True, delivery__status='pending')
        return approved_pending_jobs

    @staticmethod
    def get_open_jobs_for_user(user):
        results = set()
        candidate_jobs = Job.objects.filter(language_from__in=user.userprofile.languages_verified,
                                            language_to__in=user.userprofile.languages_verified,
                                            delivery__status='pending',
                                            ).exclude(customer=user)

        for job in candidate_jobs:
            if job.level.name <= user.userprofile.language_levels.get(language=job.language_to).level.name:
                results.add(job)
        return list(results)

    @property
    def has_translator(self):
        return self.translator_id is not None

إشارة التسليم:

@receiver(post_save,sender=Job)
def create_delivery(sender,instance,created,**kwargs):
    if created:
        delivery,created_delivery = Delivery.objects.get_or_create(job=instance)
        instance.delivery = delivery
        delivery.save()
        instance.save()




django-views