Удалить одно конкретное отношение в поле ManytoMany в Django - PullRequest
0 голосов
/ 01 апреля 2019

Я новичок в кодировании, и я перешел по ссылке http://charlesleifer.com/blog/self-referencing-many-many-through/, чтобы попытаться составить простой список друзей. У меня возникают проблемы при создании представления, которое позволяет пользователям добавлять или удалять контакты из HTML. Я думаю, что если мне удастся удалить идентификатор этого отношения ManytoMany, я смогу удалить элемент в этом поле m2m, но просто не могу понять, как загрузить правильный идентификатор

Я пытался использовать .clear () и .delete (), но они будут удалять все отношения с пользователем, все, что я хочу сделать, это удалить одно конкретное отношение между двумя пользователями.

Вот моя пользовательская модель и контакт:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255,unique=True)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=25)
    contacts = models.ManyToManyField('self', through='Contact', symmetrical=False, related_name='related_to+')
    
    objects = UserManager()

    USERNAME_FIELD = 'email'
    
    
    def __str__(self):
        return self.email

    def add_contact(self, person, symm=True):
        contact, created = Contact.objects.get_or_create(
            from_person=self,
            to_person=person,
        )
        if symm:
            person.add_contact(self, False)
        return contact
    
    def remove_contact(self, person, symm=True):
        Contact.objects.filter(
            from_person=self,
            to_person=person,).delete()
        if symm:
            person.remove_contact(self, False)

class Contact(models.Model):
    current_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='owner', on_delete=models.CASCADE)
    contact_name = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name='contact_name', null = True)

Вот таблица внешнего интерфейса HTML, которую я использую для отображения каждого контакта, который есть у пользователя

        <table id="datatables-basic" class="table table-lined" style="width:100%">
          <span class="align-right" style="float:right">
              <a href="#"><img src="{% static 'images/_ionicons_svg_md-add-circle-outline.svg' %}" alt="" style="width:3em;height: 3em;" data-toggle="modal" data-target="#addcontactModalCenter"></a>
            </span>
          <thead>
            <tr>
              <th>Name</th>
              <th>Email</th>
              <th>Action</th>
            </tr>
          </thead>
          <tbody>
          {% if user.contacts %}
            {% for contact in user.contacts.all %}
            <tr>
              <td>{{ contact.first_name }} {{ contact.last_name }}</td>
              <td>{{ contact.title}}</td>
              <td>{{ contact.email }}</td>
              <td>
                <a href="#"><img src="{% static 'images/_ionicons_svg_md-trash.svg' %}" alt="" style="width:1.5em;height: 1.5em;" data-toggle="modal" data-target="#removecontactModalCenter"></a>
              </td>
            </tr>
            {% endfor %}
          {% endif %}
          </tbody>
        </table>

Когда пользователь нажимает на значок корзины, чтобы удалить контакт, я использую модальный режим, чтобы попросить пользователя подтвердить перед удалением этого контакта. После подтверждения удалите этого человека из списка контактов пользователя.

<div class="modal fade" id="removecontactModalCenter" tabindex="-1" role="dialog" aria-labelledby="removecontactModalCenterTitle" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered" role="document">
      <div class="modal-content">
        <div class="modal-body">
            <form action="{% url 'accounts:remove_contact' %}" method="POST">
            {% csrf_token %}
            <div class="modal-body">
                <h5><strong>Remove from your contact?</strong></h5>
                <input type="hidden" name="contact_id" value="{{ Contact.id }}">
              </div>
                <div class="modal-footer">           
                  <input type="submit" class="btn btn-primary" value="Yes, Remove">
                  <input type="submit" class="btn btn-secondary" data-dismiss="modal" value= "Close">
                </div>
            </form>
        </div>
      </div>
    </div>
  </div>

Однако я застрял в части просмотра, я не могу понять, как вызвать правильный соответствующий идентификатор контакта в таблице и удалить его из списка контактов пользователя:

def remove_contact(request):
   if request.method == 'POST':
       contact = Contact.objects.get(Contact.id)
       contact.delete()
       return redirect('accounts:contacts')

Пожалуйста, помогите Спасибо!

...