【问题标题】:Passing multiple parameters to Django URL将多个参数传递给 Django URL
【发布时间】:2018-03-21 04:53:29
【问题描述】:

我有 LodgingOffer 模型,可以在其中创建和住宿优惠并详细说明他们的数据:

class LodgingOffer(models.Model):

    # Foreign Key to my User model      
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    ad_title = models.CharField(null=False, blank=False,
        max_length=255, verbose_name='Título de la oferta')

    slug = models.SlugField(max_length=100, blank=True)

    country = CountryField(blank_label='(Seleccionar país)', verbose_name='Pais')

    city = models.CharField(max_length=255, blank = False, verbose_name='Ciudad')

    def __str__(self):
        return "%s" % self.ad_title

    pub_date = models.DateTimeField(
        auto_now_add=True,
    )

    def get_absolute_url(self):
        return reverse('host:detail', kwargs = {'slug' : self.slug })

# I assign slug to offer based in ad_title field,checking if slug exist
def create_slug(instance, new_slug=None):
    slug = slugify(instance.ad_title)
    if new_slug is not None:
        slug = new_slug
    qs = LodgingOffer.objects.filter(slug=slug).order_by("-id")
    exists = qs.exists()
    if exists:
        new_slug = "%s-%s" % (slug, qs.first().id)
        return create_slug(instance, new_slug=new_slug)
    return slug

# Brefore to save, assign slug to offer created above.
def pre_save_article_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = create_slug(instance)

pre_save.connect(pre_save_article_receiver, sender=LodgingOffer)

对于这个模型,我有一个名为HostingOfferDetailViewDetailView,其中显示了LodgingOffer 对象的数据

一个重要的必要条件是,在LodgingOffer 记录的详细信息中,我可以联系offer 的所有者(创建offer 的用户)向她申请。

为此,我有contact_owner_offer() 功能,该功能是向所有者提供的发送电子邮件的功能。我在HostingOfferDetailView做的这一切都是这样的:

class HostingOfferDetailView(UserProfileDataMixin, LoginRequiredMixin, DetailView):
    model = LodgingOffer
    template_name = 'lodgingoffer_detail.html'
    context_object_name = 'lodgingofferdetail'

    def get_context_data(self, **kwargs):
        context = super(HostingOfferDetailView, self).get_context_data(**kwargs)
        user = self.request.user

        # LodgingOffer object
        #lodging_offer_owner = self.get_object()

        # Get the full name of the lodging offer owner        
        lodging_offer_owner_full_name = self.get_object().created_by.get_long_name()

        # Get the lodging offer email owner
        lodging_offer_owner_email = self.get_object().created_by.email

        # Get the lodging offer title
        lodging_offer_title = self.get_object().ad_title

        # Get the user interested email in lodging offer
        user_interested_email = user.email

        # Get the user interested full name 
        user_interested_full_name = user.get_long_name()

        context['user_interested_email'] = user_interested_email

        # Send the data (lodging_offer_owner_email
        # user_interested_email and lodging_offer_title) presented 
        # above to the contact_owner_offer function
        contact_owner_offer(self.request, lodging_offer_owner_email,
                    user_interested_email, lodging_offer_title)

        return context

我的contact_owner_offer函数接收这些参数offer并通过以下方式向offer的所有者发送电子邮件:

def contact_owner_offer(request, lodging_offer_owner_email, user_interested_email, lodging_offer_title):
    user = request.user
    # print(lodging_offer_owner_email, user_interested_email)
    if user.is_authenticated:
        # print('Send email')
        mail_subject = 'Interest in your offer'

        context = {
            'lodging_offer_owner_email': lodging_offer_owner_email,
            # User offer owner - TO

            'offer': lodging_offer_title,
            # offer title

            'user_interested_email': user_interested_email,
            # user interested in the offer

            'domain': settings.SITE_URL,
            'request': request
        }

        message = render_to_string('contact_user_own_offer.html', context)

        send_mail(mail_subject, message, settings.DEFAULT_FROM_EMAIL,
                  [lodging_offer_owner_email], fail_silently=True)

到这里为止,一切正常。一切都好 当我输入报价的详细信息时,我会向所有者报价发送电子邮件。

我的意图是在模板住宿报价详细信息中,呈现一个对联系所有者报价有用的按钮,然后,我继续定义调用contact_owner_offer()函数的URL

我根据接收contact_owner_offer()函数的参数定义我的url:

这意味着,(根据我的理解-我不知道我是否错了-)我的网址应该会收到住宿优惠所有者的电子邮件、对该优惠感兴趣的用户的电子邮件以及住宿优惠标题,因此我创建了这个 URL:

url(r'^contact-to-owner/(?P<email>[\w.@+-]+)/'
        r'(?P<email>[\w.@+-]+)/(?P<slug>[\w-]+)/$',
        contact_owner_offer, name='contact_owner_offer'),

但是当我在上面定义这个 URL 时,我收到了这条消息:

File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/sre_parse.py", line 759, in _parse
    raise source.error(err.msg, len(name) + 1) from None
sre_constants.error: redefinition of group name 'email' as group 2; was group 1 at position 43

django.core.exceptions.ImproperlyConfigured: "^contact-to-owner/(?P<email>[\w.@+-]+)/(?P<email>[\w.@+-]+)/(?P<slug>[\w-]+)/$" is not a valid regular expression: redefinition of group name 'email' as group 2; was group 1 at position 43

此时,我对如何定义与这种情况相关的 URL 有点困惑,我也想知道如何在住宿优惠的模板详细信息中的按钮中调用此 URL .

我是这样打电话的,但我不知道我是否正确:

<div class="contact">
    <a class="contact-button" href="{% url 'host:contact_owner_offer' email=lodgingofferdetail.created_by.email email=user_interested_email slug=lodgingofferdetail.slug %}">
    <img src="{% static 'img/icons/contact.svg' %}" alt="">
        <span>Contact to owner offer</span>
    </a>
</div>

我很欣赏有关它的一些指导。

最好的问候

【问题讨论】:

  • 问题出在正则表达式和命名组email 两次。您能否展示一个您期望的 URL 示例,如果它应该包含两个电子邮件地址,您能不能在正则表达式中命名一个不同的东西?

标签: python regex django email sendmail


【解决方案1】:

您在正则表达式中有两个同名的组。更改正则表达式以对 URL 中的每个组进行不同的命名。

url(r'^contact-to-owner/(?P<owner_email>[\w.@+-]+)/'
    r'(?P<interested_email>[\w.@+-]+)/(?P<slug>[\w-]+)/$',
    contact_owner_offer, name='contact_owner_offer'),

【讨论】:

  • 是的,我的 URL 现在格式正确。谢谢。此刻我的疑问是,我应该如何从与这些接收的参数相关的 html 模板按钮调用此 URL?我正在尝试这个{% url 'host:contact_owner_offer' email=lodgingofferdetail.created_by.email email=user_interested_email slug=lodgingofferdetail.slug %},但我得到了NoReverseMatch
  • 我知道我使用的是slug 值而不是lodging_offer_title 参数,我不知道这是否正确..
  • 检查参数名称是否与 URL 组匹配。
  • 同时检查命名空间匹配。
  • 是的,URL定义和URL调用中的参数名称必须匹配。我冒昧地问您是否可以看到我所询问的this question 与对我在此处定义的同一个 URL 的调用有关。就是这样,我不明白给我带来的不便
猜你喜欢
  • 2021-03-30
  • 2020-09-06
  • 2021-06-05
  • 2021-09-12
  • 2018-03-21
  • 1970-01-01
  • 2021-09-14
  • 2021-03-22
  • 2021-03-04
相关资源
最近更新 更多