回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>如何解决这个<code>NoReverseMatch</code>错误?在</p>
<p>上下文</p>
<p>我想尽可能多地记录这个问题,以便能够详细说明问题的起源。在</p>
<p>我有一个名为<code>LodgingOffer</code>的模型,可以创建一个住宿优惠,并有详细的信息</p>
<pre><code>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)
# ... Another fields ...
def __str__(self):
return "%s" % self.ad_title
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)
</code></pre>
<hr/>
<p>对于这个模型,我有一个名为<code>HostingOfferDetailView</code>的详细视图。在</p>
<p>我想追求的一个重要目标是,在<code>LodgingOffer</code>对象的详细视图中,我应该能够联系该offer的所有者(object<code>LodgingOffer</code>-创建它的用户),以便其他感兴趣的用户可以应用它。在</p>
<p>我希望在<code>LodgingOffer</code>对象的详细视图中能够联系报价所有者(object<code>LodgingOffer</code>-创建它的用户),这样其他感兴趣的用户就可以应用它了</p>
<p>为此,我有一个<code>contact_owner_offer()</code>函数,在这个函数中我向这个报价的所有者发送电子邮件。在</p>
<p>我使用<code>HostingOfferDetailView</code>详细信息视图,如下所示:</p>
^{pr2}$
<p>我的<code>contact_owner_offer()</code>函数接收这些报价参数并向报价的所有者或发布者发送电子邮件,如下所示:</p>
<pre><code>def contact_owner_offer(request, lodging_offer_owner_email, user_interested_email, lodging_offer_title):
user = request.user
if user.is_authenticated:
# print('Send email')
mail_subject = 'Interest in your offer'
context = {
'lodging_offer_owner_email': lodging_offer_owner_email,
# User owner offer - TO send email message
'offer': lodging_offer_title,
# offer for which a user asks
'user_interested_email': user_interested_email,
# Interested user offer
'domain': settings.SITE_URL,
'request': request
}
message = render_to_string('contact_user_own_offer.html', context)
#to_email = lodging_offer_owner.email,
send_mail(mail_subject, message, settings.DEFAULT_FROM_EMAIL,
[lodging_offer_owner_email], fail_silently=True)
</code></pre>
<p>我做了一个测试,到目前为止,一切都是我想要的,结果是当我输入一个详细的offer对象<code>LodgingOffer</code>的URL时,会向该offer的所有者发送一封电子邮件。在</p>
<p>我希望优惠详情模板有一个包含<strong>联系优惠所有者“</strong>的按钮,当任何用户按下该按钮时,会向优惠的所有者发送电子邮件。在</p>
<p>为此,我为<code>contact_owner_offer()</code>函数定义了一个URL,它在我的模板中有一个按钮的<code>href</code>属性的链接。在</p>
<p>我根据<code>contact_owner_offer()</code>函数接收到的参数数量定义了URL(根据我的理解,这就是我的疑问和问题的原因所在)。在</p>
<p>这意味着我的URL必须接收:</p>
<ul>
<li>报价所有者的电子邮件地址</li>
<li>对报价感兴趣的用户的电子邮件地址</li>
<li>报价的标题,<strong>尽管我
给你发一个标题,我不知道这是否正确</strong>。在</li>
</ul>
<p>根据上面的网址,我创建了:</p>
<pre><code>url(r'^contact-to-owner/(?P<email>[\w.@+-]+)/from/'
r'(?P<interested_email>[\w.@+-]+)/(?P<slug>[\w-]+)/$',
contact_owner_offer, name='contact_owner_offer'),
</code></pre>
<p>然后,在我的模板中,我生成了一个html按钮,在这里我调用了这个URL,并向它们发送了它们各自的预期参数:</p>
<pre><code><div class="contact">
<a class="contact-button" href="{% url 'host:contact_owner_offer' email=lodging_offer_owner_email interested_email=user_interested_email slug=lodgingofferdetail.slug %}">
<img src="{% static 'img/icons/contact.svg' %}" alt="">
<span>Contact owner offer</span>
</a>
</div>
</code></pre>
<p>我遇到的情况是,当我输入报价详细信息模板并单击上面的<strong>联系所有者报价</strong>参考按钮时,我会收到以下错误消息:</p>
<pre><code> TypeError: contact_owner_offer() got an unexpected keyword argument 'email'
[10/Oct/2017 01:04:06] "GET /host/contact-to-owner/botibagl@gmail.com/from/ces@ces.edu.co/apartacho/ HTTP/1.1" 500 77979
</code></pre>
<p>我的追踪到了</p>
<pre><code>Traceback:
File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
42. response = get_response(request)
File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
Exception Type: TypeError at /host/contact-to-owner/botibagl@gmail.com/from/botibagl@gmail.com/apartacho/
Exception Value: contact_owner_offer() got an unexpected keyword argument 'email'
</code></pre>
<p>我不明白的是,它告诉我我的URL没有等待一个名为<code>email</code>的参数,在这个参数中,我通过模板中的按钮传递参数<code>email=lodging_offer_owner_owner_email</code>。在</p>
<p>我很感激你的指导
谨致问候</p>
<hr/>
<p><strong>更新</strong></p>
<p>根据<a href="https://stackoverflow.com/users/8482471/rajkris">@RajKris</a>和<a href="https://stackoverflow.com/users/104349/daniel-roseman">@Daniel</a>建议,我对URL regex做了一些修改,指定了我传递的关键字参数的名称。URL保持不变:</p>
<pre><code>url(r'^contact-to-owner/(?P<lodging_offer_owner_email>[\w.@+-]+)/from/'
r'(?P<interested_email>[\w.@+-]+)/(?P<slug>[\w-]+)/$',
contact_owner_offer,
name='contact_owner_offer'
),
</code></pre>
<p>这意味着,我命名url参数的方式与命名<code>contact_owner_offer()</code>接收的参数的方式相同。在</p>
<p>当我输入offer detail模板并单击<strong>联系所有者offer</strong>reference按钮时,我得到<code>NoReverseMatch</code>错误</p>
<pre><code>Template error:
In template /home/bgarcial/workspace/hostayni_platform/hosts/templates/lodgingoffer_detail.html, error at line 193
Reverse for 'contact_owner_offer' with arguments '()' and keyword arguments '{'email': 'botibagl@gmail.com', 'interested_email': 'botibagl@gmail.com', 'slug': 'apartacho'}' not found. 1 pattern(s) tried: ['host/contact-to-owner/(?P<lodging_offer_owner_email>[\\w.@+-]+)/from/(?P<interested_email>[\\w.@+-]+)/(?P<slug>[\\w-]+)/$'] 183 : </tr>
184 : <tr>
185 : <td>{{ lodgingofferdetail.room_value }}</td>
186 : <td>{{ lodgingofferdetail.additional_description }}</td>
187 : <td>{{ lodgingofferdetail.lodging_offer_owner_email }}</td>
188 : </tr>
189 : </tbody>
190 : </table>
191 : </div>
192 : <div class="contact">
193 : <a class="contact-button" href=" {% url 'host:contact_owner_offer' email=lodging_offer_owner_email interested_email=user_interested_email slug=lodgingofferdetail.slug %} ">
194 : <img src="{% static 'img/icons/contact.svg' %}" alt="">
195 : <span>Contactar</span>
196 : </a>
197 : </div>
</code></pre>
<p>一般回溯如下:</p>
<pre><code>File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/urls/resolvers.py" in _reverse_with_prefix
392. (lookup_view_s, args, kwargs, len(patterns), patterns)
Exception Type: NoReverseMatch at /host/lodging-offer/apartacho/
Exception Value: Reverse for 'contact_owner_offer' with arguments '()' and keyword arguments '{'email': 'botibagl@gmail.com', 'interested_email': 'botibagl@gmail.com', 'slug': 'apartacho'}' not found. 1 pattern(s) tried: ['host/contact-to-owner/(?P<lodging_offer_owner_email>[\\w.@+-]+)/from/(?P<interested_email>[\\w.@+-]+)/(?P<slug>[\\w-]+)/$']
</code></pre>
<p>如何解决这个<code>NoReverseMatch</code>错误?在</p>