Nano Hash - криптовалюты, майнинг, программирование

Джанго передает внешний ключ для просмотра

Привет. Возможно, кто-то может указать мне правильное направление, я изучаю Django через Tango с Django, и я также следую официальным учебникам Django, а также создаю свое собственное приложение Django для заказов на покупку.

Мне нужно понять, как я могу получить доступ к деталям внешнего ключа другой модели и сохранить их с помощью форм. В основном в моем приложении есть заказы и поставщики при создании заказа, я могу заставить параметры внешнего ключа поставщика отображаться в форме, но когда я сохраняю его, я также хочу сохранить с suppier_name в таблицу заказов, в настоящее время он просто сохраняется с supplier_id, я просмотрел множество примеров различных сценариев, но просто не могу понять, спасибо.

view.py

def add_order(request):
    if request.method == 'POST':
        form = OrderForm(request.POST)
        if form.is_valid():
            form.save(commit=True)
            return orders(request)
        else:
            print(form.errors)
    else:
        form = OrderForm()

    context_dict = {'form':form}

    return render(
        request,
        'purchaseorders/add_order.html',
        context_dict
    )

модель.py

# Create your models here.

class Supplier(models.Model):
    supplier_code = models.CharField(max_length=10)
    supplier_name = models.CharField(
        max_length=100,
        unique=True
    )
    supplier_email = models.EmailField(max_length=100)
    supplier_website = models.URLField(max_length=100)
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.supplier_name)
        super(Supplier,self).save(*args, **kwargs)

    def __unicode__(self):
        return self.supplier_name

    def __str__(self):
        return self.supplier_name

    class Meta:
        verbose_name_plural = "Suppliers"


class Order(models.Model):
    supplier = models.ForeignKey(Supplier)
    po_number = models.IntegerField(default=0)
    ordered_by = models.CharField(max_length=50)
    order_date = models.DateTimeField()
    supplier_name = models.CharField(max_length=50)
    net_value = models.DecimalField(
        decimal_places=2,
        max_digits=10
    )

    class Meta:
        verbose_name_plural = "Orders"

    def __unicode__(self):
        return self.po_number

формы.py

from django import forms
from PurchaseOrders.models import Supplier, Order

class SupplierForm(forms.ModelForm):
    supplier_code = forms.CharField(
        max_length=10,
        help_text="Please enter a unique code"
    )
    supplier_name = forms.CharField(
        max_length=100,
        help_text="Please enter the Suppliers full name"
    )
    supplier_email = forms.EmailField(
        max_length=100,
        help_text="Please enter a email address"
    )
    supplier_website = forms.URLField(
        max_length=100,
        help_text="Please enter a website"
    )
    slug = forms.CharField(
        widget=forms.HiddenInput(),
        required=False
    )

# an inline class to provide additional information on the form
    class Meta:
        # provide an association between the ModelForm and model
        model = Supplier
        fields = (
            'supplier_code', 'supplier_name', 
            'supplier_email', 'supplier_website'
        )

class OrderForm(forms.ModelForm):
    #list all form details except the Foreignkey connection
    po_number = forms.IntegerField(
        help_text="please enter a PO Number"
    )
    ordered_by = forms.CharField(
        max_length=50,
        help_text="please enter your name"
    )
    order_date = forms.DateTimeField(
        help_text="please enter a date of order"
    )
    #supplier_name = forms.ModelChoiceField(
        queryset=Supplier.objects.all()
    )
    net_value = forms.DecimalField(
        decimal_places=2,
        max_digits=10,
        help_text="please enter a net amount"
    )

    class Meta:
        # provide an association between the ModelForm and model
        model = Order

HTML

{% load staticfiles %} <!-- New line -->

<html>
    <head>
        <title>Purchase Orders</title>
    </head>

    <body>
    <img src="{% static "purchaseorders/images/po_icon.png" %}" 
    alt="PO icon" />
    <h1>Add a Order</h1>

    <form id="order_form" method="post" 
    action="/PurchaseOrders/add_order/{{ supplier }}">

        {% csrf_token %}
        {% for hidden in form.hidden_fields %}
            {{ hidden }}
        {% endfor %}
        <ul style="list-style-type:none ">
        {% for field in form.visible_fields %}
            <li></li>
            {{ field.errors }}
            {{ field.help_text }}
            <li>{{ field }}</li>
        {% endfor %}
        </ul>
        <input type="submit" name="submit" value="Add Order" />
    </form>
</body>
</html>
26.01.2015

  • Почему вы хотите это сделать? Это ненужное дублирование данных. Заказ всегда имеет доступ к имени поставщика через внешний ключ, поэтому нет смысла сохранять отдельную копию этого имени. 26.01.2015
  • Да, верное замечание, я полагаю, я просто пытаюсь понять, как я могу это сделать, если захочу, а затем, как вы указываете, понимаете, что в этом нет необходимости. 26.01.2015
  • другое мое мнение заключалось в том, что если бы я вместо этого использовал другое поле из модели поставщика, как я мог бы также найти идентификатор на основе этого поля, а затем сохранить его, когда я попытался сделать это, я получил бы ошибки нулевого ограничения целостности для внешнего ключа, 26.01.2015

Ответы:


1

Чтобы начать с заданного вопроса, вы можете зафиксировать эти данные в методе save() модели:

class Order(models.Model):
    [...]
    def save(self, *args, **kw):
        if self.supplier_id is not None:
            self.supplier_name = self.supplier.supplier_name
        super(Order, self).save(*args, **kw)

ОДНАКО, хотя в некоторых случаях вышеуказанное может быть правильным (например, если ожидается изменение имени поставщика), гораздо более типично просто получить доступ к связанному полю через существующую связь, например:

myorder.supplier.supplier_name
26.01.2015
  • Спасибо, теперь в моем шаблоне отображается myorder.supplier.supplier_name, и я понимаю, что это лучший ответ. 27.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..