Как я могу ввести текущий user_id в таблицу базы данных django?

avatar
LukeWalker
2 марта 2018 в 19:56
90
1
0

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

usr=models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

после этого появляется такая ошибка: django.db.utils.IntegrityError: Ошибка ограничения NOT NULL: devices_device.usr_id

Я пытаюсь реализовать это, потому что, когда я сохраняю свои данные, каждый пользователь может их увидеть. Но цель состоит в том, чтобы разделить информацию о пользователях. Возможно, есть более простой способ сделать это.

Использование версии 1.11.10 django

Models.py

class Device(models.Model):
  usr = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  ip = models.CharField(max_length=50)
  port_number = models.CharField(max_length=50)

Views.py

def save_device_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
            devices = Device.objects.all()
            data['html_device_list'] = render_to_string('devices/additional/partial_devices_list.html', {
                'devices': devices
            })
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)


def device_create(request):
    if request.method == 'POST':
        form = DeviceForm(request.POST)
    else:
        form = DeviceForm()
    return save_device_form(request, form, 'devices/additional/partial_device_create.html')

ОБНОВЛЕНО:

partial_device_create.html

<form method="post" action="{% url 'device_create' %}" class="js-device-create-form">
  {% csrf_token %}
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
    <h4 class="modal-title"> Create new device </h4>
  </div>
  <div class="modal-body">
    {% include 'devices/additional/partial_device_form.html' %}
  </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-default" data-dismiss="modal"> Uždaryti </button>
    <button type="submit" class="btn btn-primary"> Pridėti </button>
  </div>
</form>

save_device_form.html

{% load widget_tweaks %}

{% for field in form %}
  <div class="form-group{% if field.errors %} has-error{% endif %}">
    <label for="{{ field.id_for_label }}">{{ field.label }}</label>
    {% render_field field class="form-control" %}
    {% for error in field.errors %}
      <p class="help-block">{{ error }}</p>
    {% endfor %}
  </div>
{% endfor %}
Источник

Ответы (1)

avatar
Neeraj Kumar
2 марта 2018 в 20:04
0
def save_device_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            form = form.save(commit=False) # < use these 3 below lines for save data
            form.usr = request.user
            form.save()

В соответствии с моделью вашего устройства требуется usr, поэтому вам нужно сохранить usr, как я сделал в своем коде

LukeWalker
2 марта 2018 в 20:20
0

спасибо за быстрый ответ! но, к сожалению, теперь есть TypeError: объект «Устройство» не является итерируемым

LukeWalker
2 марта 2018 в 20:42
0

....... Файл "C:\Users\lukas\Desktop\WiFi Controller\valdiklis\devices\views.py", строка 41, в device_create return save_device_form(запрос, форма, 'devices/additional/partial_device_create.html ') Файл "C:\Users\lukas\Desktop\WiFi Controller\valdiklis\devices\views.py", строка 29, в save_device_form data['html_form'] = render_to_string(template_name, context, request=request) File "C :\Users\lukas\Anaconda3\envs\env\lib\site-packages\django\template\loader.py", строка 68, в render_to_string ........

Neeraj Kumar
3 марта 2018 в 14:56
0

у вас проблема в коде шаблона. Шаблон render_to_string не получает объект устройства итератора