将多个参数传递给 Django URL
Passing multiple parameters to Django URL
我有 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)
对于这个模型,我有一个名为 HostingOfferDetailView
的 DetailView
,其中显示了 LodgingOffer
object
的数据
一个重要的前提是,在 LodgingOffer
记录的详细信息中,我可以联系要约的所有者(创建要约的用户)向她申请。
为此,我有 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
函数接收这些参数报价并通过以下方式向报价所有者发送电子邮件:
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)
到这里为止,一切正常。都是O.K。
当我输入报价的详细信息时,我会向所有者报价发送电子邮件。
我的意图是在模板住宿报价详细信息中呈现一个按钮,这将有助于联系业主报价,然后,我继续定义我的 URL 调用 contact_owner_offer()
函数
我根据接收contact_owner_offer()
函数的参数定义我的url:
这意味着,(根据我的理解 - 我不知道我是否错了 -)我的 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>
我很欣赏它的一些方向。
此致
您在正则表达式中有两个同名的组。更改正则表达式以不同方式命名 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'),
我有 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)
对于这个模型,我有一个名为 HostingOfferDetailView
的 DetailView
,其中显示了 LodgingOffer
object
一个重要的前提是,在 LodgingOffer
记录的详细信息中,我可以联系要约的所有者(创建要约的用户)向她申请。
为此,我有 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
函数接收这些参数报价并通过以下方式向报价所有者发送电子邮件:
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)
到这里为止,一切正常。都是O.K。 当我输入报价的详细信息时,我会向所有者报价发送电子邮件。
我的意图是在模板住宿报价详细信息中呈现一个按钮,这将有助于联系业主报价,然后,我继续定义我的 URL 调用 contact_owner_offer()
函数
我根据接收contact_owner_offer()
函数的参数定义我的url:
这意味着,(根据我的理解 - 我不知道我是否错了 -)我的 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>
我很欣赏它的一些方向。
此致
您在正则表达式中有两个同名的组。更改正则表达式以不同方式命名 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'),