0
votes

I'm a new face to Django so please be considerate to if ever my problem is something stupid. So I have been practicing Django, I've run into problems with tegards to NoReverseMatch, I went through answers in stackoverflow but still I couldn't find where I went wrong. Can you help me a bit guys?

views.py

@login_required(login_url="admin-login")
@user_passes_test(check_role_admin)
def colorProductMap_edit(request, id):
    instance = ColorProductMapping.objects.get(color_p_map_id=id)
    print(instance.color_id)
    form = ColorProductMapForm(instance=instance)
    if request.method == 'POST':
        form = ColorProductMapForm(request.POST, instance=instance)
        if form.is_valid():
            form.save()
            return redirect('/admin1/colorProductMap')
    else:
        form = ColorProductMapForm(instance=instance)

    return render(request, 'admin1/colorProductMap.html', {'form': form, 'instance': instance})

I properly partnered and connected with the following in my urls.py. urls.py

path('colorProductMap_edit/<int:id>', views.colorProductMap_edit, name="admin-color-product-map-edit"),

forms.py

class ColorProductMapForm(forms.ModelForm):
    class Meta:
        model = ColorProductMapping
        fields = ['color_id', 'prod_id']

models.py

class ColorProductMapping(models.Model):
    color_p_map_id = models.AutoField("Color & Product Map ID", primary_key=True, auto_created=True)
    color_id = models.ForeignKey(Color, null=False, on_delete=models.CASCADE, verbose_name="Color ID")
    prod_id = models.ForeignKey(Product, null=False, on_delete=models.CASCADE, verbose_name="Product Id")

colorProductMap.html

{% extends 'admin1/layout/master.html' %}
{% block title %}Color Product Map{% endblock %}
{% block main %}
<h1>
    <center>Color Product Map</center>
</h1>
<div class="container">
    <div class="row">
        <div class="col-lg-2"></div>
        <div class="col-lg-10">
            {%if colorProductMap_show%}
            <button type="button" class="btn btn-primary mt-2" data-toggle="modal" data-target="#modal-primary">Add
                Color Product Mapping
            </button>
            <div class="modal fade" id="modal-primary">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h4 class="modal-title">Add Color Product Mapping</h4>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">&times;</span></button>
                        </div>
                        <div class="modal-body mt-2">
                            <form action="{% url 'admin-color-product-map'%}" method="POST"
                                  enctype="multipart/form-data">
                                {% csrf_token %}
                                <table border="1" class="table table-bordered border border-info">
                                    <tr>
                                        <th>
                                            {{form.color_id.label_tag}}
                                        </th>
                                        <td>{{form.color_id}}</td>
                                    </tr>
                                    <tr>
                                        <th>
                                            {{form.prod_id.label_tag}}
                                        </th>
                                        <td>
                                            {{form.prod_id}}
                                        </td>
                                    </tr>
                                </table>
                                <div class="modal-footer justify-content-right">
                                    <input type="Submit" name="Submit" value="Submit" class="btn btn-outline-success">
                                    <button type="button" class="btn btn-outline-danger" data-dismiss="modal">Close
                                    </button>
                                </div>
                            </form>
                        </div>
                    </div>
                    <!-- /.modal-content -->
                </div>
                <!-- /.modal-dialog -->
            </div>
            <!-- /.modal -->

            <div class="container-fluid ">
                <div class="row">
                    <div class="card mt-2 border border-secondary">
                        <div class="card-header">
                            <h3 class="card-title ">Color Product Map Table</h3>
                        </div>
                        <!-- /.card-header -->
                        <div class="card-body">

                            <table class="table table-bordered border border-info">
                                <thead>
                                <tr>
                                    <th>Color Product Mapping Id</th>
                                    <th>Product ID</th>
                                    <th>Color ID</th>
                                    <th>Action</th>
                                </tr>
                                </thead>
                                <tbody class="justify-content-center">
                                {% for x in colorProductMap_show %}
                                <tr>
                                    <td>{{x.color_p_map_id}}</td>
                                    <td>{{x.prod_id}}</td>
                                    <td>{{x.color_id}}</td>
                                    <td><a href="{% url 'admin-color-product-map-edit' x.color_p_map_id %}"
                                           class="btn btn-outline-primary mt-2"><i
                                            class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
                                        <a href="{% url 'admin-color-product-map-delete' x.color_p_map_id %}"
                                           class="btn btn-outline-danger mt-2"><i
                                                class="fa fa-trash" aria-hidden="true"></i></a>
                                    </td>
                                </tr>

                                {% endfor %}

                                </tbody>
                            </table>

                        </div>
                        <!-- /.card-body -->
                        <div class="card-footer clearfix ">
                            <ul class="pagination pagination-sm m-0 justify-content-center">
                                {% if colorProductMap_show.has_previous %}
                                <li class="page-item"><a class="page-link"
                                                         href="?page={{colorProductMap_show.previous_page_number}}">
                                    Previous </a>
                                </li>
                                {% endif%}
                                {% for x in colorProductMap_show.paginator.page_range %}

                                {% if colorProductMap_show.number == x %}
                                <li class="page-item active"><a class="page-link" href="?page={{x}}">{{x}}</a></li>
                                {% else%}
                                <li class="page-item"><a class="page-link" href="?page={{x}}">{{x}}</a></li>
                                {% endif %}
                                {% endfor %}

                                {% if colorProductMap_show.has_next %}
                                <li class="page-item"><a class="page-link"
                                                         href="?page={{colorProductMap_show.next_page_number}}">
                                    Next </a>
                                </li>
                                {% endif %}
                            </ul>
                        </div>
                    </div>
                    <!-- /.card -->
                </div>
            </div>


            {%endif%}
            {% if instance %}
            <form action="{% url 'admin-color-product-map-edit' x.color_p_map_id %}" method="POST"
                  enctype="multipart/form-data">
                {% csrf_token %}
                 <table border="1" class="table table-bordered border border-info">
                                    <tr>
                                        <th>
                                            {{form.color_id.label_tag}}
                                        </th>
                                        <td>{{form.color_id}}</td>
                                    </tr>
                                    <tr>
                                        <th>
                                            {{form.prod_id.label_tag}}
                                        </th>
                                        <td>
                                            {{form.prod_id}}
                                        </td>
                                    </tr>
                                </table>
                    <input type="Submit" name="Submit" value="Submit" class="btn btn-success w-50"><br>
                <div class="modal-footer justify-content-between">
                    <button type="button" class="btn btn-outline-light" data-dismiss="modal">Close
                    </button>
                </div>
            </form>

            {% endif %}
        </div>
    </div>
</div>
{% endblock %}

What am I doing wrong? I think I have followed every advice I could find, but yeah it still gives me the error. Any help is appreciated. Thank you very much!

2
You have {% if colorProductMap_show %} the variable referred here you don't pass into the context from the view, in it you loop over it for x. Now after this if ends you have {% if instance %} which you do pass into the context but in it you write {% url 'admin-color-product-map-edit' x.color_p_map_id %} Not to mention that the previous loop (which won't even run for this view) has already ended you also don't have any variable x in the context, how would this work? - Abdul Aziz Barkat
Why not @staff_member_required by @user_passes_test(check_role_admin)? - Waket Zheng
@AbdulAzizBarkat thanks your comment helped me to find my mistake. - Chauhan Mukesh
@WaketZheng I have created my own roles in models so to check the roles I have created some method and cause of that i have used @user_passes_test(check_role_admin) instead of @staff_member_required - Chauhan Mukesh

2 Answers

1
votes

You write your form tag as:

<form action="{% url 'admin-color-product-map-edit' x.color_p_map_id %}" method="POST"
                  enctype="multipart/form-data">

After observing your template and view it appears that you are using the same template for multiple views and this is causing confusion. As I note in the comment there is no x in the context for this view (In the other one you loop over a variable which doesn't exist in this view to get this). After looking a bit more one notices that by this {% url 'admin-color-product-map-edit' x.color_p_map_id %} you want to point to the current url itself. If a forms action is to the same url the best thing to do is forego the action attribute completely (If there is no action attribute the request would be to the same url as the page user is in):

<form method="POST" enctype="multipart/form-data">
0
votes

Thanks all to guide me, I have found my mistake.

In the html template, as shown below

<form action="{% url 'admin-color-product-map-edit' x.color_p_map_id %}" method="POST"
                  enctype="multipart/form-data">

Here I am using x.color_p_map_id where x is not any iterable object so the error I was getting.

Now I have made a change and used instance instead of x in above url and now its working fine.

<form action="{% url 'admin-color-product-map-edit' instance.color_p_map_id %}" method="POST"
                  enctype="multipart/form-data">