mac95782
mac95782

Reputation: 71

Getting a NoReverseMatch error Django when creating url link in template

not sure why I'm getting this error , I have checked my views and paths , which i think seem fine, the noreversematch error I get shows the arguments ('wonderful', 'bass', 1)' are correct, but it throws back this error:

NoReverseMatch at /instrument-detail/wonderful/1/ Reverse for 'create_eq' with arguments '('wonderful', 'bass', 1)' not found. 1 pattern(s) tried: ['create\-eq/(?P<track_slug>[-a-zA-Z0-9_]+)/(?P<instrument_slug>[-a-zA-Z0-9_]+)/int:id>/$']

here are my views, urls, models, and the template where i have the link to 'create_eq' :

urls.py

path('create-eq/<slug:track_slug>/<slug:instrument_slug>/int:id>/', views.create_eq, name='create_eq'),
path('instrument-detail/<slug:track_slug>/<int:id>/', views.instrument_detail, name='instrument_detail'),

views.py

@login_required
def create_eq(request, track_slug, instrument_slug, id):
    user = request.user
    track = get_object_or_404(Track, id=id)
    instrument = get_object_or_404(Instrument, id=id)
    if request.method == "POST":
        form = EQCreateForm(request.POST)
        if form.is_valid():
            data = form.save(commit=False)
            data.user = user
            data.save()
            return redirect('profile', slug=track.slug, id=track.id)
    else:
        form = EQCreateForm()
    return render(request, 'feed/create_eq.html', {'form': form })



@login_required
def instrument_detail(request, track_slug, id):
    user = request.user
    track = get_object_or_404(Track, id=id)
    my_inst = Instrument.objects.filter(track_id=track.id)
    instrument_obj = get_object_or_404(Instrument, id=id)
    if my_inst.exists():
        instruments = Instrument.objects.filter(track_id=track.id)
        context = {
            'instruments': instruments,
            'track': track,
            'instrument': instrument_obj,
        }
        return render(request, 'feed/instrument_detail.html', context)
    else:
        print('There are no instruments set in your track')
        return redirect('create_instrument', track_slug=track.slug, id=track.id)

models.py

class Instrument(models.Model):
    title     = models.CharField(max_length=120)
    timestamp = models.DateTimeField(auto_now_add=True)
    updated   = models.DateTimeField(auto_now=True)
    track     = models.ForeignKey('Track', on_delete=models.CASCADE, null=True)
    artist    = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    slug      = models.SlugField(null=True, unique=True)

    def __str__(self):
        return 'title:{} track:{} artist:{}'.format(self.title, self.track, self.artist)


    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        return super(Instrument, self).save(*args, **kwargs)


class EQ(models.Model):
    frequency   = models.DecimalField(decimal_places=3, max_digits=20)
    description = models.TextField(max_length=250, null=True, blank=True) 
    boost       = models.DecimalField(decimal_places=2, max_digits=10, default=0)
    cut         = models.DecimalField(decimal_places=2, max_digits=10, default=0)
    updated     = models.DateTimeField(auto_now=True)
    instrument  = models.ForeignKey(Instrument,on_delete=models.CASCADE)
    track       = models.ForeignKey('Track', on_delete=models.CASCADE)
    user_name   = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):
        return 'frequency:{} instrument:{} track:{} boost:{} cut:{} user_name:{} description:{}'.format(self.frequency, self.instrument, self.track, self.boost, self.cut, self.user_name, self.description)


class Track(models.Model):
    title       = models.CharField(max_length=100)
    description = models.TextField(max_length=250, null=True, blank=True)
    artist      = models.CharField(max_length=250)
    timestamp   = models.DateTimeField(auto_now_add=True)
    updated     = models.DateTimeField(auto_now=True)
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    slug        = models.SlugField(null=True, unique=True)

instrument_detail.html

{% for items in instruments %}
    <div class="col">
        <div class="card one-track">
            <a href="{% url 'create_eq' track.slug instrument.slug track.id %}"><h5>{{ items.title }}</h5></a>
        </div>
    </div>

{% endfor %}

Upvotes: 0

Views: 39

Answers (1)

Mojtaba Arezoomand
Mojtaba Arezoomand

Reputation: 2380

you have a typo mistake, you forgot the < in your url path.
it's <int:id> not int:id>.

path('create-eq/<slug:track_slug>/<slug:instrument_slug>/<int:id>/', views.create_eq, name='create_eq'),

Upvotes: 1

Related Questions