В Django, какой способ передачи аргументов в представление create лучше?
Мне нужна помощь в двух вопросах.
Номер один: У меня есть модель Orders и общее представление create для нее и модель OrderDetails с представлением create. После создания заказа метод get_absolute_url
в модели Orders перенаправляет на страницу с формой создания OrderDetails. Я хочу, чтобы эта форма создания OrderDetails получала аргументы из только что созданного заказа, такие как order.pk, теперь я должен заполнить это поле вручную. Итак, является ли метод get_absolute_url
тем, что мне нужно, или я должен переопределить метод dispatch
в моем представлении, но возможно мне нужно поработать над методом get_success_url
?
Номер два: когда я перехожу на страницу создания заказа, как автоматически заполнить поле Сотрудник? Например, я вошел в систему как Боб Смит, и когда я создаю новый заказ, я не хочу указывать себя там вручную, я хочу, чтобы система сделала это за меня.
Вот модели:
class OrderDetails(models.Model):
order = models.OneToOneField('Orders', models.DO_NOTHING, primary_key=True)
product = models.ForeignKey('products.Products', models.DO_NOTHING)
unit_price = models.FloatField()
quantity = models.SmallIntegerField()
discount = models.FloatField()
class Meta:
managed = False
db_table = 'order_details'
unique_together = (('order', 'product'),)
class Orders(models.Model):
customer = models.ForeignKey('contractors.Customers', models.DO_NOTHING, blank=True, null=True)
employee = models.ForeignKey('employees.Employees', models.DO_NOTHING, blank=True, null=True)
order_date = models.DateField(blank=True, null=True)
required_date = models.DateField(blank=True, null=True)
shipped_date = models.DateField(blank=True, null=True)
ship_via = models.ForeignKey('contractors.Shippers', models.DO_NOTHING, db_column='ship_via', blank=True, null=True)
freight = models.FloatField(blank=True, null=True)
ship_name = models.CharField(max_length=40, blank=True, null=True)
ship_address = models.CharField(max_length=60, blank=True, null=True)
ship_city = models.CharField(max_length=15, blank=True, null=True)
ship_region = models.CharField(max_length=15, blank=True, null=True)
ship_postal_code = models.CharField(max_length=10, blank=True, null=True)
ship_country = models.CharField(max_length=15, blank=True, null=True)
class Meta:
managed = False
db_table = 'orders'
def get_absolute_url(self):
return u'/orders/%d/details' % self.pk
def __str__(self):
return f"{self.customer} {self.order_date}"
Просмотров:
class OrdersCreateView(LoginRequiredMixin, CreateView):
model = Orders
template_name = 'orders/orders_create.html'
form_class = OrderCreateOrUpdateForm
def form_valid(self, form):
return super().form_valid(form)
class OrderDetailsCreateView(LoginRequiredMixin, CreateView):
model = OrderDetails
template_name = 'orders/orderdetails_create.html'
form_class = OrderDetailCreateOrUpdateForm
def form_valid(self, form):
return super().form_valid(form)
Формы:
class OrderCreateOrUpdateForm(forms.ModelForm):
class Meta:
model = Orders
fields = [
'customer', 'employee', 'order_date', 'required_date',
'shipped_date', 'ship_via', 'freight', 'ship_name', 'ship_address',
'ship_city', 'ship_region', 'ship_postal_code', 'ship_country']
widgets = {
'order_date': DateInput(),
'required_date': DateInput(),
'shipped_date': DateInput(),
}
class OrderDetailCreateOrUpdateForm(forms.ModelForm):
class Meta:
model = OrderDetails
fields = ['order', 'product', 'unit_price', 'quantity', 'discount']
Шаблоны:
{% extends 'home/base.html' %}
{% block content %}
<h2>Order <p>{{ object.customer }}</p> <p>{{ object.order_date }}</p></h2>
<p>{{ object.employee }}</p> <p>{{object.required_date}}</p> <p>{{object.shipped_date}}</p>
<p>{{object.ship_via}}</p> <p>{{ object.freight }}</p> <p>{{ship_name}}</p> <p>{{ship_address}}</p>
<p>{{ ship_city}}</p> <p>{{ship_region}}</p> <p>{{ship_postal_code}}</p> <p>{{ship_country}}</p>
<a href="{{ object.pk }}/update">Change order data</a>
{% endblock %}
{% extends 'home/base.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<div>
<form method='POST'>
{% csrf_token %}
<fieldset class='form-group'>
<legend class='border-bottom mb-4'>
Add order details</legend>
{{ form|crispy }}
</fieldset>
<div class='form-group'>
<button class="btn btn-outline-info" type=
"submit">Send</button>
</div>
</form>
</div>
{% endblock content %}